【问题标题】:Why would one component's ActionListener affect another one?为什么一个组件的 ActionListener 会影响另一个组件?
【发布时间】:2012-02-10 23:00:43
【问题描述】:

在我的程序中,我有几个摆动组件,我遇到的一个问题是,如果触发了动作事件,我的 ActionPerformed 方法会触发两次。我最终发现这是由于我的 confirmBtn(JButton) 意外添加了两次 ActionListener。

但是,有一件事我不明白,而且我对 Java 还很陌生,所以请原谅我提出一些看似显而易见的问题:

我已经为我的所有组件提供了这样的动作监听器:

confirmBtn.addActionListener(this);

然后在我的ActionPerformed(ActionEvent e) 方法中引用它们,如下所示:

if(e.getSource() == confirmBtn)
    Execute code....

我的问题是,为什么不小心给一个 组件一个额外的ActionListener,它是否会影响在ActionPerformed 方法中调用的所有其他组件,使它们也被触发两次?这与我给每个组件 ActionListeners 的方式有关吗?

【问题讨论】:

  • 另外,如果问题标题措辞不正确,我很抱歉,因为很难尝试解释
  • 那么您的意思是,不小心将同一个动作监听器添加到同一个组件两次(导致它被调用两次),您添加到其他组件的所有其他动作监听器也被触发了两次?跨度>
  • 是的,我的问题是为什么会这样,我不明白它背后的逻辑。
  • @GuillaumePolet 感谢您的回复,我是一名学习 Java 的学生,现在才刚刚掌握基本元素。我的问题是我有一个 addBookingButton 并且它的事件被触发了两次。当我为 confirmBtn (完全不相关的按钮)删除额外的 actionListener 时,addBookingButton 事件只触发了一次,所以我认为这就是原因。你说得对,我可能不应该太快得出这个结论,但这是我能想到的唯一合乎逻辑的事情。

标签: java swing


【解决方案1】:

您是否为所有组件注册了相同的ActionListenerthis在你的声明中

confirmBtn.addActionListener(this);

让我这么想。我不推荐它,因为你必须在 actionPerformed() 方法中实现更复杂的逻辑,而且事情很快就会变得混乱。

我要做的是为每个组件创建单独的ActionListeners,以便它们彼此独立工作。这可以使用inner, local or anonymous classes 轻松完成。例如,假设您有两个按钮,一个用于确认,一个用于取消。我建议的结构是:

public class MyFrame extends JFrame {
    ...
    public void mySetup() {
        ...
        confirmBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                 confirmed(e); // delegate to outer class for cleaner code
            }
        });

        canceledBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                cancelled(e); // delegate to outer class for cleaner code
            }
        });
        ...
    }
    ...   
    private void confirmed(ActionEvent e) {
        // Your real confirmBtn action code 
    }

    private void cancelled(ActionEvent e) {
        // Your real cancelBtn action code
    }
    ...
}

这种方式会更冗长,但由于每个组件都有自己的ActionListener,因此意外交互的可能性要小得多。

【讨论】:

  • 感谢您的回答,因此您可以为每个组件事件提供自己的方法,而不是使用一个包含大量 if else 语句的大型 ActionPerformed() 方法。我是否正确地说我的做法是糟糕的编码实践和养成的坏习惯?谢谢:)
  • @Jake 我个人当然更喜欢几个独立的小方法,而不是每个人都调用的一个大方法
猜你喜欢
  • 2018-11-24
  • 2019-10-25
  • 2015-01-30
  • 2020-01-06
  • 2015-05-20
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
相关资源
最近更新 更多