为什么一个组件的ActionListener会影响另一个组件?

时间:2012-02-10 23:00:44

标签: java swing

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

然而,有一件事我不明白,而且我对Java很新,请原谅我提出看似显而易见的事情:

我给了我所有的组件动作监听器:

confirmBtn.addActionListener(this);

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

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

我的问题是,为什么然后,通过意外地给予一个组件一个额外的ActionListener,它是否通过使它们也被触发两次来影响ActionPerformed方法中调用的所有其他组件?是否与我给每个组件ActionListeners的方式有关?

1 个答案:

答案 0 :(得分:0)

您是否为所有组件注册了相同的ActionListener?您声明中的this

confirmBtn.addActionListener(this);

让我这么认为。我不推荐它,因为你必须在actionPerformed()方法中实现更复杂的逻辑,事情可能会很快搞砸。

我要做的是为每个组件创建单独的ActionListener,以便它们彼此独立工作。这可以使用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,因此意外交互的可能性要小得多。