1

我刚刚开始了解 Java 本身和 Java Swing,但我在理解“动作侦听器”概念时遇到了一些问题。人们说 C# 和 Java 非常相似,但是当您实际尝试它们并进行比较时,那就是另一回事了。

我有以下自动生成的按钮动作监听器:

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

我是这样理解的:

  1. 您通过对象“btnNewButton” btnNewButton.addActionListener()调用非静态方法
  2. 该方法将一个 ActionListener 实例作为参数
  3. 自动化代码通过“new ActionListener()”构造函数调用实例化一个 ActionListener 实例 - 我不明白的是我自己不能实例化 ActionListener 类,但它可以作为方法调用中的参数?
  4. 在新实例主体内生成“actionPerformed”方法并在此处使用(什么?)
  5. 在“actionPerformed”方法中,您定义单击按钮时要做什么 - 非常有意义

是否有可能以更理解/更简单的方式来帮助我理解 ActionListener 概念?

4

1 回答 1

12

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

当你这样做

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

你实际上是在创建一个匿名子类的实例ActionListener

它在语义上等同于做

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

btnNewButton.addActionListener(new AnonymousActionListener());

(还有 tada,作为奖励,您刚刚了解到您可以在 Java 中拥有方法本地类;-)


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

  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. 封闭类本身实现ActionListenerthis用作参数addActionListener

    class YourClass implements ActionListener {
    
        public void yourMethod() {
            ...
            btnNewButton.addActionListener(this);
        }
    
        public void actionPerformed(ActionEvent e) {
            lblNylabel.setText("New label text");
        }
    }
    
于 2012-04-25T07:19:28.463 回答