在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();
}
}
当然可以添加、删除ActionListeners,但不能像您尝试的那样。如果更改侦听器变量引用的ActionListener,这将不会对已添加到JButton的ActionListen产生影响。您必须通过JButton的addActionListener(...)
和removeActionListener(...)
方法专门向JButton添加或删除侦听器才能产生此效果。我认为你需要理解的关键点是,listener变量与它可能引用的ActionListener对象不同。这个变量所做的只是引用一个ActionListener,如果已经给了它一个对象的话。它对可能正在或可能没有在侦听JButton的ActionListeners绝对没有影响。
顺便说一句,您当前的代码似乎正在尝试将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,有些人认为这是一种更干净的方法。