2

我正在尝试了解有关事件处理的更多信息,但在我读到的任何地方,它主要是关于如何使用它,所以会发生一些事情,而不是它是如何工作的。

到目前为止,我知道单击按钮时发生某些事情的两种方法。

动作监听器:

myButton.addActionListener(new ActionListener() { @override actionPerformed... });

和抽象动作:

public class MyAction extends AbstractAction {
    public MyAction(String text, ImageIcon icon, String desc, Integer mnemonic) {
        super(text, icon);
        putValue(SHORT_DESCRIPTION, desc);
        putValue(MNEMONIC_KEY, mnemonic);
    }
    public void actionPerformed(ActionEvent e) {
        System.out.println("Action", e);
    }
}

MyAction myAction = new MyAction(...);
myButton.setAction(myAction);

我知道我可以将我想要发生的所有事情写进actionPerfomed()方法中。

但是由于我不知道,在后台到底发生了什么,我不知道一个人是否比另一个人更有优势,或者我应该在哪种情况下使用哪个?

4

1 回答 1

2

如果扩展 AbstractAction,则不能扩展任何其他类。无论如何,您可能希望尽可能避免使用子类。我个人建议实现接口ActionListener,然后在使用“this”关键字的同时将动作监听器添加到您的摇摆对象(或您监听的任何东西)。

public class ClassName implements ActionListener {
    private JButton button = new JButton("click me");
    public ClassName() {
        button.addActionListener(this);
    }
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == button) {
            //perform action
        }
    }
}

当然,您也可以ActionListener直接添加(通过 using .addActionListener(new ActionListener() {});,但通过 using this,您可以将所有操作组合在一起。

//edit:另一种方法是 using MouseListener,它可以监听对象上的任何点击,因此使您也可以将摆动对象JLabel用作“按钮” - 但是,如果您使用JButtons,这将是不必要的努力,考虑到这ActionListener是一种方式更易于使用,并且您不必创建很多类(例如mousePressedmouseClickedmouseReleased等)。但是,如果您仍然需要MouseListener某个地方,您可能需要考虑使用它们,以便将所有事件组合在一起。注意:我不知道是否同样快ActionListenerMouseListener或者这些方法中的一种是否更好!如果您的程序已经需要大量功率,您可能想要使用ActionListener,我想这是更快的方法,如果这两种解决方案中的任何一种是更快的一种。

于 2016-02-20T13:23:01.463 回答