私は次のコードを持っています:
_JButton button = new JButton("Clear");
button.addActionListener(this);
_
私が理解している限り、「クリア」と書かれたボタンを作成します。次に、アクションをこのボタンに関連付ける必要があり(ボタンが押された場合に何が起こるか)、それはaddActionListener
によって行われます。正しいですか?
しかし、私が理解していないのは、アクションが指定されている場所です。ボタンを押すとテキスト領域がクリアされ、私が理解している限り、テキスト領域をクリアするコードがどこかにあるはずです。しかし、与えられた例では、addActionListener()
の引数には「this」しかありません。
ボタンが押されたときにテキスト領域をクリアする必要があることをプログラムはどのように認識しますか?
必要な場合は、完全なコードが与えられます ここ 。
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);
}
}
}
各 JButton
には、 EventListenerList
があります。 addActionListener(this)
を呼び出すと、 ActionListener
、actionPerformed()
という名前のコールバック関数がリストに追加されます。メソッドを呼び出すコードの概要を見ることができます ここ 。実際のfireActionPerformed()
メソッドは AbstractButton
にあります。 JButton
は JComponent
であり、イベントを使用するさまざまなクラスの中で リストを参照 リスナーリストメカニズム。
this
はインターフェースを実装しているため、button.addActionListener( this )
を呼び出します ActionListener
。ボタンがクリックされると、メソッドactionPerformed(ActionEvent e)
(インターフェイスによって定義され、クラスによって実装されます)が呼び出されます。
イベントジェネレータは、そのイベントを処理できるオブジェクトについて通知されます。イベントジェネレータにはメソッドがあります。 — addActionListener(Handlerクラスのオブジェクトへの参照)たとえば、
JButton b1=new JButton("My Button");
b1.addActionListener(this); // Please note listener and generator are same class
イベントハンドラーはボタンを含む同じオブジェクト内にあるため、参照を渡すにはthis
を使用する必要があります。
基本的に、UIイベント処理のメカニズムはJVMキューイベントであり、各タイプのイベントにはサブスクライバーがあります。ボタンがクリックされるなど、イベントが発生すると、JVMはそれに応じて処理をイベントのサブスクライバーに委任します。また、このサブスクライバークラスは、イベントを処理するためのメソッド、つまりイベントハンドラーを定義する必要があります。
あなたの場合、button.addActionListener(this);を呼び出すとき。コードは実際にこのKeyEventDemoインスタンスをタイプclickのイベントにサブスクライブします。次に、ボタンがクリックされると、KeyEventDemoのactionPerformedメソッドがトリガーされます。