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