ActionListener 与 AbstractAction

ActionListener vs AbstractAction

我正在尝试了解有关事件处理的更多信息,但无论我读到什么,它主要是关于如何使用它以便发生某些事情,而不是它如何工作。

到目前为止,我知道有两种方法可以在单击按钮时让事情发生。

ActionListener:

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() 方法。

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

如果您扩展 AbstractAction,则不能扩展任何其他 类。无论如何,您可能希望尽可能避免使用 sub类。 我个人建议实现接口 ActionListener,然后在使用 "this" 关键字时向您的 swing 对象(或任何您监听的对象)添加一个动作监听器。

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(使用.addActionListener(new ActionListener() {});,但使用this,您可以将所有操作组合在一起。

//edit:另一种方法是使用 MouseListener,它可以侦听对您的对象的任何点击,因此您也可以将 JLabel 之类的摇摆对象用作 "buttons" - 然而,如果你使用 JButtons,这将是不必要的努力,考虑到 ActionListener 更容易使用,而且你不必创建很多 类(例如 mousePressedmouseClickedmouseReleased 等)。但是,如果您无论如何都需要 MouseListener 某处,您可能需要考虑使用它们,以便将所有事件组合在一起。 注意:我不知道 ActionListenerMouseListener 是否同样快,或者这些方法中的一种是否更好!如果您的程序已经需要很多功能,您可能想使用 ActionListener,我想这是更快的方法,如果两个解决方案中的任何一个是更快的。