我正在尝试更多地了解事件处理,但在我读到它的任何地方,它主要是关于如何使用它以便发生某些事情而不是它是如何工作的。
到目前为止,我知道在单击按钮时有两种方法可以实现。
的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()
方法中写下我想要发生的一切。
但是,由于我不知道,在背景中究竟发生了什么,我无法判断一个人是否比另一个人有任何优势,或者我应该在哪种情况下使用哪一个?
答案 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
,则可能需要考虑使用它们,以便将所有事件组合在一起。
注意:我不知道MouseListener
和ActionListener
是否同样快,或者其中一种方法更好!如果你的程序已经需要很多功能,你可能想要使用MouseListener
,我猜这是更快的方法,如果两个解决方案中的任何一个更快的话。