1

Javaでは、オブジェクトの構築後にリスナーへの参照を変更できますか?たとえば、このクラスのオブジェクトがインスタンス化されたときに、セッターを使用してリスナーを変更できますか?できない場合は、どうすればよいですか。必要なときにリスナーを変更することを意味しますか?

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

}
4

1 に答える 1

1

確かにActionListenersを追加、削除できますが、試しているようにはできません。リスナー変数によって参照される ActionListener を変更しても、JButton に追加されたものには影響しません。この効果を得るには、メソッドaddActionListener(...)とメソッドを介して JButton にリスナーを明確に追加または削除する必要があります。removeActionListener(...)理解する必要がある重要なポイントは、リスナー変数が、それが参照する可能性がある ActionListener オブジェクトと同じではないということだと思います。この変数が行うことは、ActionListener オブジェクトが指定されている場合、そのオブジェクトを参照することだけです。JButton をリッスンしている場合とリッスンしていない場合がある ActionListener にはまったく影響しません。

ちなみに、現在のコード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 を設定することもできます。

于 2012-11-19T23:04:45.153 に答える