Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ActionListener与AbstractAction_Java_Actionlistener_Abstract Action - Fatal编程技术网

Java ActionListener与AbstractAction

Java ActionListener与AbstractAction,java,actionlistener,abstract-action,Java,Actionlistener,Abstract Action,我正试图学习更多关于事件处理的知识,但无论我在哪里读到它,主要是关于如何使用它以使事情发生,而不是它如何工作 到目前为止,我知道当点击一个按钮时,有两种方法可以让事情发生 ActionListener: myButton.addActionListener(new ActionListener() { @override actionPerformed... }); 和行动: public class MyAction extends AbstractAction { public M

我正试图学习更多关于事件处理的知识,但无论我在哪里读到它,主要是关于如何使用它以使事情发生,而不是它如何工作

到目前为止,我知道当点击一个按钮时,有两种方法可以让事情发生

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,就不能扩展任何其他类。在任何情况下,您可能希望尽可能避免使用子类。 我个人建议实现接口
ActionListener
,然后在使用“this”关键字的同时,向swing对象(或您侦听的任何对象)添加一个ActionListener


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

//编辑:另一种方法是使用
MouseListener
,它可以监听对象上的任何单击,因此也可以使用像
JLabel
这样的swing对象作为“按钮”-但是,如果您使用
JButtons
,这将是不必要的工作,因为
ActionListener
更易于使用,并且您不必创建大量的类(例如
mousePressed
mouseClicked
mouserereleased
,等等)。但是,如果您仍然需要
鼠标侦听器
,您可能需要考虑使用它们,以便将所有事件分组在一起。
注意:我不知道
ActionListener
MouseListener
是否同样快,或者这些方法中是否有一种更好!如果您的程序已经需要大量的功能,您可能会想使用
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的匿名实现来避免这种情况,这些匿名实现只完成了它们的目的,而不做其他任何事情。它将不同的功能分开。
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
        }
    }
}