我想向按钮添加事件处理 - 我注意到有两种方法可以做到这一点。
示例:
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");
}
});
第二种方法如何正常工作????? !!!
谢谢!
答案 0 :(得分:3)
没有必要为第一种方法定义第二类。你只需要添加
在您的类实现ActionListener之后,在您的类中使用public void actionPerformed(ActionEvent e)
方法并执行您想要的任何操作。如果你愿意,可以使用第二课,但没有必要。缺点是您需要使用long if语句指定事件的来源,以便在有多个JButton时采取适当的操作,即
第二种方法是向每个组件添加一个匿名的内部ActionListener。这是一种更加面向对象的方法,因为您可以更清楚地分离小部件的功能。定义在每个actionPerformed中调用的附加方法是有利的,以便能够自由地使用 this 并引用包含的类:
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)
}
答案 1 :(得分:1)
您的问题并不完全在侦听器上,因为它是关于接口如何工作以及如何在Java中实例化类。这里有一些更好的观点:
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 = new MyButtonActionListener(); button.addActionListener(myActionListener);
另一方面,在Java中你可以实例化一个类anonimousy,这意味着它不是对它的实例有一个处理程序(比如上面代码中的myActionListener),你只需在你需要它的地方动态实例化它,以后你将无法使用它。这就是你的代码中发生的事情:ActionListener实现随时被视为addActionListener方法的参数,即时声明中还包括匿名实例不仅是任何类的语句,而是实现ActionListener的语句,等等您的匿名声明需要提供actionPerformed方法的实现。
第三个选项是拥有一个实现ActionListener(和actionPerformed方法)的类,并且在该类中,如果您创建一个JButton并且想要将它作为侦听器传递给ecompasing类的一个实例,那么您将使用它“这个”就是为了这个,如:
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!");
}
}
这个讨论有很多细节(比如你如何在另一个类中的一个匿名类中对“this”进行攻击,以及你如何对包含类实例的“this”进行攻击)。我建议你阅读一本关于Sun认证Java程序员认证的书,它有一章专门介绍这个
答案 2 :(得分:0)
这只是创建一个实现actionPerformed方法的匿名类。这样,您就不必为要处理事件的每个位置定义新类。
答案 3 :(得分:0)
它的工作方式与第一种技术相同,即该方法需要一个实现ActionListener接口的对象。然而,这两种技术都有其自身的优点和缺点。第一种技术允许以混乱的if / else代码为代价来利用单个对象,因为相同的方法将处理多个按钮的事件。第二种技术允许为每个按钮更清晰地分离逻辑,代价是创建多个匿名对象(对于每个按钮)。
答案 4 :(得分:0)
无论哪种方式,要添加ActionListener,您都需要一个实现ActionListener接口的类(定义单个方法actionPerformed
)。 addActionListener(this)
表示this
实现了该接口,执行的任何操作都会调用this.actionPerformed
。
在第二种情况下,您正在做的是创建一个实现ActionListener接口的新的匿名类。单击countButton
时,调用的actionPerformed
方法是匿名类中的方法。