ActionListener与AbstractAction

时间:2016-02-20 12:16:00

标签: java actionlistener abstract-action

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

到目前为止,我知道在单击按钮时有两种方法可以实现。

的ActionListener:

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

和AbstractAction:

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()方法中写下我想要发生的一切。

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

1 个答案:

答案 0 :(得分:2)

如果扩展AbstractAction,则不能扩展任何其他类。在任何情况下,您可能希望尽可能避免使用子类。 我个人建议实现接口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,您可以将所有操作组合在一起。

//编辑:另一种方法是使用MouseListener,它可以收听对象的任何点击,因此您也可以使用JLabel等摆动对象作为“按钮” - 但是,如果你使用JButtons,这是不必要的努力,考虑到ActionListener更容易使用,而且你不必创建很多类(例如mousePressed,{{1 },mouseClicked等)。但是,如果您在某处需要mouseReleased,则可能需要考虑使用它们,以便将所有事件组合在一起。 注意:我不知道MouseListenerActionListener是否同样快,或者其中一种方法更好!如果你的程序已经需要很多功能,你可能想要使用MouseListener,我猜这是更快的方法,如果两个解决方案中的任何一个更快的话。