java - 了解 ActionListener

标签 java swing actionlistener

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

我有一个按钮的以下自动生成的 Action 监听器:

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 概念?

最佳答案

What I don't understand is that I can't instansiate the ActionListener class myself, but it's possible as an argument in the method call??

当你做的时候

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");
        }
    }
    

关于java - 了解 ActionListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10311014/

相关文章:

java - 使用 JFileChooser 打开文件

java - 是否可以在同一程序的多个实例的多个线程之间进行通信?

java - 如何将按钮设置为在内容 Pane /容器中不可见

java - Java 中的三态复选框

java - 如何使用简单的 JSON 库基于索引获取整个 JSON 数组

java - JPanel.setSize() 不工作

java - 最大化内部框架

java - 当在 java 中动态添加项目时,如何避免触发 JComboBox 的 actionlistener 事件?

java - javax.swing.Timer 的困难

java - Android 上的 SimpleDateFormat 解析