Java 编写动作侦听器的常用方法是什么?
我刚开始学习如何使用动作监听器。据我所知,其工作方式如下:Java 编写动作侦听器的常用方法是什么?,java,actionlistener,Java,Actionlistener,我刚开始学习如何使用动作监听器。据我所知,其工作方式如下: 默认情况下,有些类包含“addActionListener”方法(例如按钮类) 使用此方法,我们向对象添加一个动作侦听器。例如:listenedObject.addActionListener(listeningObject) 当执行带有“ListendObject”的操作时,将调用“listeningObject”的“actionPerformed”方法。因此,这意味着当我们为ListingObject编程一个类时,我们需要在其中放置
listenedObject.addActionListener(listeningObject)
在我看来,我们需要创建的每个被监听对象都是“个人”动作监听器,我们可以通过为动作监听器的相应字段设置特定值来实现。但我不确定这是否是一种标准的方式?人们通常是怎么做的?根据我个人的经验判断,最常见的处理方法是创建一个匿名内联类。像这样:
listenedObject.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
// Your action handling code in here
}
});
我经常看到人们调用包含ListendObject的对象的方法。例如,在具有按钮的对话框中:
myOkayButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
okayButtonPressed();
}
});
然后在对话框类的后面部分:
private void okayButtonPressed() {
// Do what we need to do
}
个人而言,如果可能的话,我更喜欢使用类(例如
AbstractAction
的子类),而不是简单地依赖于动作侦听器。通过这种方式,我可以为原始小部件提供名称、图标、工具提示等…我一直认为有用的方式(用于导航)是创建一个匿名内部类,然后委托给外部类:
listenedObject.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
listenedObject_actionPerformed(evt);
}
});
private void listenedObject_actionPerformed(ActionEvent evt) {
//Your handling goes here
}
然后,使用结构查找(IDEA中的CTRL+F12,Eclipse中的CTRL+O)更容易在IDE中处理代码
使用单个类(如GUIMyColPanel
)作为一组组件(按钮等)的公共侦听器的问题在于actionPerformed
方法会进行大量丑陋的if-else
比较,以确定实际按下了哪个按钮-根本不是很OO
当然,您不应该过分担心这类事情的性能方面,因为它们在极端情况下可能可以忽略不计!众所周知,过早优化是一件坏事注意方法removeActionListener的存在是有原因的。如果所侦听的对象将与处理事件的对象一起消亡,则可以跳过侦听器清理。但是,如果您的组件侦听外部源提供的模型,则应该在addNotify中添加侦听器,并在removeNotify方法中删除它们。否则,您可能会发生内存泄漏。可能现在还没有,但我相信在不久的将来(在Java 7发布之后),类似这样的事情将是常见的方式:
listenedObject.addActionListener ( #{doSmth();} );
我一直认为有用的方法是创建一个单独的类,该类实现ActionListener接口和执行操作所需的所有其他方法。这样,一个动作就不会绑定到一个特定的对象,可以通过一个按钮、一个菜单等来触发。有点像我猜的那样。它使代码保持简单 匿名类是不可重用的
重定向到包含ListendObject的对象会导致难以维护的庞大类。OK。我懂了。顺便问一下,@Override是什么意思?甚至是:public void actionPerformed(ActionEvent e){onMyButtonClicked();}-几乎是一个方法pointer@Override是注释,表示Public void actionPerformed()重写其超类中的方法。当您创建这样的内联匿名类时,您正在重写ActionListener。您只是没有给它一个名称。注释只是告诉编译器在超类中查找被重写的方法,如果它不在超类中或不匹配,则对您大喊大叫。您还可以调用evt.getSource()来获取引发事件的对象-这意味着您可以使用单个侦听器侦听多个事件源上的事件。。。例如,JFrame上通常有侦听器来侦听该JFrame的许多控件的操作。