【问题标题】:ActionListener vs AbstractAction [duplicate]ActionListener vs AbstractAction [重复]
【发布时间】:2016-02-20 12:16:00
【问题描述】:

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

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

动作监听器:

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

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

【问题讨论】:

    标签: java actionlistener abstract-action


    【解决方案1】:

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

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

    【讨论】:

    • 那么会有人使用扩展 AbstractAction 的类而不是实现 ActionListener 的情况吗?
    • @Flikk 我认为扩展AbstractAction 而不是实现ActionListener 没有多大意义 - 但是,如果你可以扩展AbstractAction想定义你自己的子类。例如,我曾经创建了一个扩展 abstractAction 的类,因为我想创建键绑定,并且在某些时候某个方法需要一个“Action”作为参数 (ActionMap.put(Object key, Action action)。不过,我对 Action 类不太熟悉,所以也许我也不需要它。
    • "但是通过使用this,您可以将所有操作组合在一起。" - 这在某些情况下并不理想,例如当类为很多事件实现一个动作时:#actionPerformed() 方法将充满if(e.getSource == thisbutton) {...} else if (e.getSource() == thatButton) {} else if (...),您可以通过使用 ActionListener 或 AbstractAction 的匿名实现来避免它们的目的是单点,仅此而已。它将不同的功能分开。
    猜你喜欢
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    相关资源
    最近更新 更多