何时注册听众?

时间:2012-11-19 23:01:28

标签: java user-interface event-handling

在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();
    }

}

1 个答案:

答案 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,有些人认为这是一种更清晰的方法。