addActionListener(this)和addActionListen(new ActionListener)有



我想为按钮添加事件处理,我注意到有两种方法可以做到这一点。

  1. 实现ActionListener接口,然后将事件侦听器附加到按钮

示例:

countButton.addActionListener(this);

ActionPerformed方法中的将运行以显示结果。

  1. 不要实现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中实例化类。以下是一些细节:

  1. 基本上,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方法就是匿名类中的方法。

相关内容

  • 没有找到相关文章

最新更新