我想为按钮添加事件处理,我注意到有两种方法可以做到这一点。
- 实现ActionListener接口,然后将事件侦听器附加到按钮
示例:
countButton.addActionListener(this);
ActionPerformed方法中的将运行以显示结果。
不要实现ActionListener接口,而是这样做:
countButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //Execute when button is pressed System.out.println("You clicked the button"); } });
第二种方法是如何工作的?????!!!
谢谢!
没有必要为第一种方法定义第二个类。您只需要添加public void actionPerformed(ActionEvent e)
方法,并在使类实现ActionListener之后在那里执行您想要的任何操作。如果你愿意,你可以使用第二个类,但这不是必须的。缺点是,如果您有多个JButton(即(,则需要用长if语句指定事件的来源,以便采取适当的操作
第二种方法是向每个组件添加一个匿名的内部ActionListener。这是一种更加面向对象的方法,因为您对小部件的功能有了更清晰的分离。为了能够自由使用this并引用包含类,在每个actionPerformed内部定义一个调用的附加方法是有利的
countButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
doCountButtonAction(e);
// "this" here would refer to the ActionListener (not that useful)
}
});
并实现方法:
private void doCountButtonAction(ActionEvent e) {
// do whatever you need to here
// using "this" here refers to the containing class (i.e. JFrame, JPanel or whatever)
}
您的问题并不完全是关于监听器,而是关于接口如何工作以及如何在Java中实例化类。以下是一些细节:
- 基本上,JButton类为您提供的是一种声明类的方法,该类的一个特定方法将在按钮上触发事件时被调用,比如单击按钮时。如果您查看JButton和ActionListener的Javadocs,您现在将了解它们的工作方式:
http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/AbstractButton.html#addActionListener(java.awt.event.ActionListener(
http://download.oracle.com/javase/1.4.2/docs/api/java/awt/event/ActionListener.html
在这里,你可以用最老式的方式创建一个类,当有人点击你的按钮时会触发这个类:
public class MyButtonActionListener implements ActionListener {
actionPerformed(ActionEvent e) {
System.out.println("Aww, you clicked!");
}
}
现在,一旦完成,你就可以疯狂地使用它,并将其作为监听器添加到你的按钮中:
JButton button = new JButton("My button");
MyButtonActionListener myActionListener=新的MyButtonActionListener((;button.addActionListener(myActionListener(;
另一方面,在Java中,你可以匿名实例化一个类,这意味着你不需要为它的实例设置一个处理程序(就像上面代码中的myActionListener(,只需要在需要的地方动态实例化它,以后就没有处理程序可以使用了。这就是你的代码中发生的事情:ActionListener实现被动态地作为addActionListener方法的参数进行delcare,动态声明还包括这样一个声明,即你的匿名实例不仅仅是任何类,而是实现ActionListener的实例,这样你的匿名声明需要给出actionPerformed方法的实现。
第三种选择是有一个实现ActionListener(和actionPerformed方法(的类,在该类中,如果您创建了一个JButton,并希望将其作为侦听器传递给电子商务类的一个实例,那么您将使用"this"来引用它,如:
public class MyButtonActionListener implements ActionListener {
private JButton button = new JButton();
public void init() {
button.addActionListener(this);
}
public actionPerformed(ActionEvent e) {
System.out.println("u clicked!");
}
}
这个讨论有很多更精细的地方(比如你如何引用一个匿名类delcare在另一个类中的"this",以及你如何引用包含类实例的"this"(。我建议您阅读一本关于Sun认证Java程序员认证的书,其中有一章专门介绍这个
它只是创建了一个匿名类来实现actionPerformed方法。这样,您就不必为每个要处理事件的地方定义一个新的类。
它的工作方式与第一种技术相同,即该方法需要一个实现ActionListener接口的对象。然而,这两种技术都有其优点和缺点。第一种技术允许以杂乱的if/else代码为代价使用单个对象,因为相同的方法将处理多个按钮的事件。第二种技术允许更干净地分离每个按钮的逻辑,而不需要(为每个按钮(创建多个匿名对象。
无论哪种方式,要添加ActionListener,都需要一个实现ActionListener接口的类(它定义了一个方法actionPerformed
(。addActionListener(this)
意味着this
实现了该接口,并且执行的任何操作都将调用this.actionPerformed
。
在第二种情况下,您要做的是创建一个新的匿名类,该类实现ActionListener接口。单击countButton
时,调用的actionPerformed
方法就是匿名类中的方法。