添加动作监听器的语法

4
当我输入以下代码时:
JButton aButton = new JButton("Button");
aButtin.addActionListener(this);

我的IDE(NetBeans)将这个语句标记为泄漏语句。 尽管使用这种语句似乎从未产生任何负面影响,但我阅读过的一些文档表明更正确的方法是将动作监听器作为实现ActionListener的内部类的新实例添加。 NetBeans和这些文档知道我不知道的是什么? “泄漏this语句”真正意味着什么? 在这种方式中使用this会有我不知道的负面影响吗?


1
这个观点基于什么?我只是在问是否有一种方法比另一种更具有技术优势!我并不是在征求意见,而是想要澄清为什么在重复使用方法的情况下,一种方法可能比另一种更好。 - Jeremy Johnson
1
这是基于意见的;请看下面我的答案。没有具体的优劣点,也没有明确正确的答案 - 在所有这些情况下都有编写等效代码的方法。对于这个问题的所有可能答案完全基于个人意见和偏好。这就像问“什么颜色最好?它的优点是什么?”-如果你真的相信有一种量化的“最好”颜色,那么我想你不会意识到这个问题是基于意见的,但实际上它是的,这种信念是错误的。 - Jason C
2
@JasonC,我认为你的论点不太公平——这个问题确实有一定的价值。例如,如果您多次使用addActionListenernew ButtonPress()将占用更多的空间。您假设它们在技术上是相等的,这种假设过于草率。 - sdasdadas
2
楼主,你可能会对Actions感兴趣,参见:http://docs.oracle.com/javase/tutorial/uiswing/misc/action.html - sdasdadas
1
@JasonC 我只是在回应你关于它们等价的说法。实际上它们并不等价。 - sdasdadas
显示剩余10条评论
3个回答

4

有三种方法

  • aButton.addActionListener(this); 在类声明包含implements ActionListener并且还有public void actionPerformed(ActionEvent ae) {的情况下

例如伪代码

public class ButtonDemo implements ActionListener{

    aButton.addActionListener(this);    

    @Override
    public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();
        if (source == aButton) {

        } 
    }
}
  • aButton.addActionListener(new ButtonPress());用于在ActionListener被声明为单独的类的情况下使用。

例如:伪代码

public class ButtonDemo {    
     aButton.addActionListener(new ButtonPress());
}

public class ButtonPress implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {

    }
}
  • 更简单、更清晰且没有副作用(上午两种方式)是创建内部匿名监听器

例如伪代码:

    aButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {

        }
    });

如果我们在第一个示例中使用 new ButtonDemo() 替换 this,会发生什么? - Caffe Latte
new ButtonDemo() 将成为 aButton 事件的监听器,而内部的 public void actionPerformed(ActionEvent e) 方法将不会用于 aButton 的事件。 - mKorbel

2
如果您使用this,那么为了让this处理来自多个来源的ActionEvents,您需要添加逻辑来检查动作的来源或命令字符串。这是完全合理的。
如果您使用其他类,则可以使用在其他地方实现的ActionListeners,或重用为特定常见目的设计的ActionListeners,或者定义例如匿名内部类等行内类,在您的情况下可能更方便。这也是完全合理的。
不要从“优势”或“劣势”的角度思考——这是一个常见的错误(做xyz是否“糟糕”?xyz是否“好的实践”?)。您应该根据您的情况和提供最清晰、最易于维护、正确运行的代码的方式使用任何有意义的东西。具有常识,熟悉您正在使用的语言和可用选项,做出明智的判断。一种语言是表达思想的一种方式,请清晰地表达(键入)。

1
请详细解释如何进行有建设性的负评,回答应包含每种方法的优缺点并且正确。出于恶意的负评是不合适的,只会让读者感到困惑。 - Jason C

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接