Java 为什么一个组件';谁的行为会影响另一个?

Java 为什么一个组件';谁的行为会影响另一个?,java,swing,Java,Swing,在我的程序中,我有几个swing组件,我遇到的一个问题是,如果触发动作事件,我的ActionPerformed方法将触发两次。我最终发现这是由于我的confirbmtn(JButton)意外地添加了两次ActionListener 但是,有一件事我不明白,而且我对Java相当陌生,所以请原谅我问了一些似乎显而易见的问题: 我给我的所有组件提供了如下操作侦听器: confirmBtn.addActionListener(this); if(e.getSource() == confirmBtn)

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

但是,有一件事我不明白,而且我对Java相当陌生,所以请原谅我问了一些似乎显而易见的问题:

我给我的所有组件提供了如下操作侦听器:

confirmBtn.addActionListener(this);
if(e.getSource() == confirmBtn)
    Execute code....
然后在我的
ActionPerformed(ActionEvent e)
方法中引用它们,如下所示:

confirmBtn.addActionListener(this);
if(e.getSource() == confirmBtn)
    Execute code....

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

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

confirmBtn.addActionListener(this);
让我这么想。我不建议这样做,因为这样你就必须在
actionPerformed()
方法中实现更复杂的逻辑,事情很快就会搞砸

我要做的是为每个组件创建单独的
ActionListener
s,以便它们彼此独立工作。这可以很容易地使用。举个例子,考虑你有两个按钮,一个用于确认,一个用于取消。我提议的结构是:

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
,因此发生意外交互的可能性要小得多。

此外,很抱歉,如果问题标题的措辞不正确,因为很难尝试和解释,那么您的意思是,通过意外地将同一个动作侦听器添加到同一组件两次(导致调用两次),添加到其他组件的所有其他动作侦听器也会触发两次?是的,我的问题是为什么会发生这种情况,我不明白它背后的逻辑。@GuillaumePolet谢谢你的回答,我是一名学习Java的学生,只是刚刚开始掌握基本元素。我的问题是我有一个addBookingButton,它的事件被触发了两次。当我删除ConfirmBN(完全不相关的按钮)的额外actionListener时,addBookingButton事件只触发了一次,所以我认为这就是原因。你是对的,我可能不应该太快得出这个结论,但这是我能想到的唯一合乎逻辑的事情。谢谢你的回答,因此,与其让一个大ActionPerformed()方法包含许多针对单个组件的if-else语句,不如让每个组件事件都有自己的方法。我说的对吗?我当时的做法是糟糕的编码实践和坏习惯?谢谢:)@Jake就我个人而言,我当然更喜欢几个独立的小方法,而不是每个人都称之为大方法的方法