在我的程序中,我有几个swing组件,我遇到的一个问题是,如果触发了一个动作事件,我的ActionPerformed方法会触发两次。我最终发现这是由于我的 confirmBtn (JButton)偶然添加了两次ActionListener。
然而,有一件事我不明白,而且我对Java很新,请原谅我提出看似显而易见的事情:
我给了我所有的组件动作监听器:
confirmBtn.addActionListener(this);
然后在我的ActionPerformed(ActionEvent e)
方法中引用它们,如下所示:
if(e.getSource() == confirmBtn)
Execute code....
我的问题是,为什么然后,通过意外地给予一个组件一个额外的ActionListener,它是否通过使它们也被触发两次来影响ActionPerformed方法中调用的所有其他组件?是否与我给每个组件ActionListeners的方式有关?
答案 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
,因此意外交互的可能性要小得多。