addActionListener(this)和addActionListener(new ActionListener)有什么区别?

时间:2011-09-15 18:25:02

标签: java event-handling actionlistener

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

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

    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");
          }
      });  
      
    2. 第二种方法如何正常工作????? !!!

      谢谢!

5 个答案:

答案 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中实例化类。这里有一些更好的观点:

  1. Basicaly,JButton类为您提供的方法是声明一个类,当按钮触发事件时,将调用一个特定方法的类,就像单击它时一样。如果您查看Javadocs for JButton和ActionListener,现在将了解它们的工作原理:
  2. 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 = 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方法是匿名类中的方法。