了解ActionListener

时间:2012-04-25 07:15:19

标签: java swing actionlistener

我刚刚开始了解Java本身和Java Swing,我在理解“Action Listener”概念时遇到了一些问题。人们说C#和Java非常相似,但是当你真正试用它们并进行比较时,这是另一个故事。

我为按钮提供了以下自动生成的动作侦听器:

btnNewButton.addActionListener(new ActionListener() 
{
    public void actionPerformed(ActionEvent e) 
    {
        lblNylabel.setText("New label text");
    }
});

我理解如下:

  1. 您通过对象“btnNewButton” btnNewButton.addActionListener()
  2. 调用非静态方法
  3. 该方法将一个ActionListener实例作为参数
  4. 自动代码通过“new ActionListener()”构造函数调用实现ActionListener实例 - 我不明白的是我不能自己实例化ActionListener类,但它可以作为方法调用中的参数吗? ?
  5. 在新实例主体内部生成“actionPerformed”方法,并在此处使用(What?)
  6. 在“actionPerformed”方法中,您可以定义单击按钮时要执行的操作 - 非常有意义
  7. 是否可以通过更加理解/简单的方式来帮助我理解ActionListener概念呢?

1 个答案:

答案 0 :(得分:12)

  

我不明白的是我不能自己实现ActionListener类,但它可以作为方法调用中的参数??

当你这样做时

new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        lblNylabel.setText("New label text");
   }
}

您实际上正在创建anonymous subclass ActionListener的实例。

它在语义上等同于做

class AnonymousActionListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        lblNylabel.setText("New label text");
   }
}

btnNewButton.addActionListener(new AnonymousActionListener());

(tada,作为奖励,你刚刚得知你可以在Java中拥有method local classes; - )


以下是一些常见的替代方案:

  1. 使用单独的普通班级

    class MyActionListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            lblNylabel.setText("New label text");
        }
    }
    
    class YourClass {
    
        public void yourMethod() {
            ...
            btnNewButton.addActionListener(new MyActionListener());
        }
    }
    

    (只有在其他类可以访问所需变量的情况下才有可能。)

  2. 与上述相同,但内(非静态)类

    class YourClass {
    
        public void yourMethod() {
            ...
            btnNewButton.addActionListener(new MyActionListener());
        }
    
        // Inner class
        class MyActionListener implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                lblNylabel.setText("New label text");
            }
        }
    }
    

    (这里lblNylabel可能在内部类的范围内。)

  3. 封闭类本身实现ActionListener 并使用this作为addActionListener的参数:

    class YourClass implements ActionListener {
    
        public void yourMethod() {
            ...
            btnNewButton.addActionListener(this);
        }
    
        public void actionPerformed(ActionEvent e) {
            lblNylabel.setText("New label text");
        }
    }