Java ActionListener与AbstractAction
我正试图学习更多关于事件处理的知识,但无论我在哪里读到它,主要是关于如何使用它以使事情发生,而不是它如何工作 到目前为止,我知道当点击一个按钮时,有两种方法可以让事情发生 ActionListener: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
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
}
}
}