我应该为每个类似的操作或通用操作使用单独的ActionListener吗



我正在用java创建一个使用按钮的键盘,当用户单击标记为从a到Z的按钮时,它会将JTextField文本设置为a或他们按下的任何按钮。

我为每个按钮都有一个单独的类,所以对于a的public class listenser1 implements ActionListener,B的public class listenser2 implements ActionListener,这是一个好的方法吗?

我也试着在一个类下做这件事,并使用if和if else语句使用购买

        if(a.getText().equals("A"))
        {
           input1.setText(input.getText() + "A");       
        }
        .
        .
        .

这不起作用,它打印出ABCDEFGHIJKLMNOPQRSTUVWXYZ,而不仅仅是一个字母。

不,这不是最有效的方法。写起来太费时间了。相反,试试这个:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
public class Example extends JFrame implements ActionListener {
    private final String[] letters = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
    private JButton[] buttons = new JButton[26];
    private JTextArea text = new JTextArea();
    public Example() {
        super("Example");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        for (int i = 0; i < letters.length; i++) {
            buttons[i] = new JButton(letters[i]);
            buttons[i].addActionListener(this);
            add(buttons[i]);
        }
        add(text);
        pack();
        setVisible(true);
    }
    public void actionPerformed(ActionEvent event) {
        text.append(event.getActionCommand());
    }
    public static void main(String[] args) {
        Example ex = new Example();
    }
}

我建议每个操作创建一个监听器实例。匿名内部类可以通过读取一个final本地类来很容易地进行参数化。

void addButton(final char letter) {
    JButton button = new JButton(Character.toString(letter));
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            input.setText(input.getText() + letter);
        }
    });
    panel.add(button);
}

(我建议直接选择Document,而不是JtextComponent.getText/setText。)

为什么不使用一个类,比如说:

ActionListener commonListener = new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        Object o = e.getSource();
        if (o instanceof JButton) {
            JButton button = (JButton)o;
            String command = (String) button.getActionCommand()();
            input1.setText(command);
        }
    }
};

您可以将此监听器添加到您的按钮中,如下所示:

buttonA = new JButton();
buttonA.addActionListener(commonListener);
buttonA.setActionCommand("A"); // same for others till Z.

希望这能对你有所帮助。

您可以编写一个参数化侦听器:

    private class LetterActionListener implements ActionListener {
        private final char letter;
        public LetterActionListener(char letter) {
            this.letter = letter;
        }
        @Override
        public void actionPerformed(ActionEvent e) {
             input1.setText(input1.getText() + letter);
        }
    }

创建ActionListener的一个实例,并将其添加到循环中的每个按钮:

    final JTextField input1;
    ...
    final ActionListener l = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            input1.setText(input1.getText() + ((JButton) e.getSource()).getText());
        }
    };
    for (char c = 'A'; c <= 'Z'; c++) {
        final JButton jButton = new JButton(String.valueOf(c));
        panel.add(jButton);
        jButton.addActionListener(l);
    }

相关内容

  • 没有找到相关文章

最新更新