了解ActionListener

Bir*_*man 1 java swing actionlistener

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

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

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

我这样理解:

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

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

aio*_*obe 12

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

当你这样做

new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        lblNylabel.setText("New label text");
   }
}
Run Code Online (Sandbox Code Playgroud)

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

它在语义上等同于做

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

btnNewButton.addActionListener(new AnonymousActionListener());
Run Code Online (Sandbox Code Playgroud)

(还有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());
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

  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");
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    (这里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");
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)