在java中,我可以在构造对象后更改对侦听器的引用吗? 例如,当实例化此类的对象时,是否可以使用其setter更改侦听器? 如果我不能,我怎么能这样做,我的意思是在我需要时改变听众?
public class ListenerTest extends JFrame {
ActionListener listener;
public ListenerTest() {
JPanel jPanel = new JPanel();
JButton jButton = new JButton("Activate!");
jButton.addActionListener(listener);
jPanel.add(jButton);
add(jPanel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Demo Drawing");
setLocationRelativeTo(null);
pack();
setVisible(true);
}
public ActionListener getListener() {
return listener;
}
public void setListener(ActionListener listener) {
this.listener = listener;
}
public static void main(String[] args) {
ListenerTest frame = new ListenerTest();
}
}
答案 0 :(得分:1)
当然你可以添加,删除ActionListeners,但不能像你一样尝试。如果更改了listener变量引用的ActionListener,则这对已添加到JButton的那个没有影响。您必须通过其addActionListener(...)
和removeActionListener(...)
方法专门向JButton添加或删除侦听器才能产生此效果。我认为你需要理解的关键点是listener变量与它可能引用的ActionListener对象不同。所有这个变量都是指一个ActionListener对象,如果给它一个。它对ActionListener完全没有影响,可能会也可能不会监听JButton。
顺便说一下,你当前的代码似乎是试图将null
添加为JButton的ActionListener,因为它在将类添加到类中的按钮时为侦听器变量null。构造函数:
ActionListener listener; // variable is null here
public ListenerTest() {
JPanel jPanel = new JPanel();
JButton jButton = new JButton("Activate!");
jButton.addActionListener(listener); // variable is still null here!
// ....
}
public void setListener(ActionListener listener) {
this.listener = listener; // this has no effect on the JButton
}
也许您想要这样做:
public void setListener(ActionListener listener) {
jButton.addActionListener(listener);
}
或者如果您希望添加侦听器来代替所有现有的ActionListeners
public void setListener(ActionListener listener) {
ActionListener[] listeners = jButton.getActionListeners();
for(ActionListener l : listeners) {
jButton.removeActionListener(l); // remove all current ActionListeners
}
// set new ActionListener
jButton.addActionListener(listener);
}
如果您更喜欢使用AbstractActions,也可以设置JButton的Action,有些人认为这是一种更清晰的方法。