web-dev-qa-db-ja.com

addActionListenerは何をしますか?

私は次のコードを持っています:

_JButton button = new JButton("Clear");
button.addActionListener(this);
_

私が理解している限り、「クリア」と書かれたボタンを作成します。次に、アクションをこのボタンに関連付ける必要があり(ボタンが押された場合に何が起こるか)、それはaddActionListenerによって行われます。正しいですか?

しかし、私が理解していないのは、アクションが指定されている場所です。ボタンを押すとテキスト領域がクリアされ、私が理解している限り、テキスト領域をクリアするコードがどこかにあるはずです。しかし、与えられた例では、addActionListener()の引数には「this」しかありません。

ボタンが押されたときにテキスト領域をクリアする必要があることをプログラムはどのように認識しますか?

必要な場合は、完全なコードが与えられます ここ

10
Roman

ActionListener はコールバックメカニズムです。コントロールが追加されてActionEventが起動されるたびに、public void actionPerformed(ActionEvent e)メソッドが呼び出されます。

私が理解していないのは、actionPerformedがどこで呼び出されるかです。クラス内で定義されているようですが、このメソッドが呼び出される場所はありません。

これは、UIコンポーネントの内部メカニズムによって呼び出されます。概念的には、次のようなコードを考えることができます。

public class Button {
  private final List<ActionListener> listeners = new ArrayList<ActionListener>();

  public void addActionListener(ActionListener l) {
    listeners.add(l);
  }

  public void click() {
    ActionEvent event = new ActionEvent(this, 0, "click");
    for (ActionListener l : listeners) {
      l.actionPerformed(event);
    }
  }
}
16
McDowell

JButton には、 EventListenerList があります。 addActionListener(this)を呼び出すと、 ActionListeneractionPerformed()という名前のコールバック関数がリストに追加されます。メソッドを呼び出すコードの概要を見ることができます ここ 。実際のfireActionPerformed()メソッドは AbstractButton にあります。 JButtonJComponent であり、イベントを使用するさまざまなクラスの中で リストを参照 リスナーリストメカニズム。

2
trashgod

thisはインターフェースを実装しているため、button.addActionListener( this )を呼び出します ActionListener 。ボタンがクリックされると、メソッドactionPerformed(ActionEvent e)(インターフェイスによって定義され、クラスによって実装されます)が呼び出されます。

1
tangens

イベントジェネレータは、そのイベントを処理できるオブジェクトについて通知されます。イベントジェネレータにはメソッドがあります。 — addActionListener(Handlerクラスのオブジェクトへの参照)たとえば、

JButton b1=new JButton("My Button");
 b1.addActionListener(this); // Please note listener and generator are same class

イベントハンドラーはボタンを含む同じオブジェクト内にあるため、参照を渡すにはthisを使用する必要があります。

0
Kameron

基本的に、UIイベント処理のメカニズムはJVMキューイベントであり、各タイプのイベントにはサブスクライバーがあります。ボタンがクリックされるなど、イベントが発生すると、JVMはそれに応じて処理をイベントのサブスクライバーに委任します。また、このサブスクライバークラスは、イベントを処理するためのメソッド、つまりイベントハンドラーを定義する必要があります。

あなたの場合、button.addActionListener(this);を呼び出すとき。コードは実際にこのKeyEventDemoインスタンスをタイプclickのイベントにサブスクライブします。次に、ボタンがクリックされると、KeyEventDemoのactionPerformedメソッドがトリガーされます。

0
CCNA