イベントとリスナー

カスタムイベントをどのように作成し、コンポーネントがイベントを取得できるようにどのように起動しますか?

カスタムイベントを確認する前に、既存のイベントを確認しましょうActionEvent

などの部品ButtonJButton火災オフActionEventsコンポーネント定義のアクションのいくつかの種類を示します。たとえば、ユーザーが押すたびにButton発火しActionEventます。イベントの全体的なポイントは、GUIのコンポーネントに何かが起こったことをリスナーに通知することです。イベントには、リスナーが何が起こったのか、誰に起こったのか(イベントの内容と担当者)を把握するために必要なすべての情報が含まれています。イベントは、それ自体を完全に説明するのに十分な情報を提供する必要があります。そうすることで、リスナーは正確に何が起こったのかを理解し、意味のある方法で応答することができます。

ActionEventは、アクションのコマンド文字列、修飾子、および識別文字列を学習するためのメソッドが含まれています。このgetActionCommand()メソッドは、印刷やコピー(何)など、イベントの意図されたアクションを示すコマンド文字列を返します。このgetSource()メソッドは、イベントを生成するオブジェクト(who)を返します。

を受信するにActionEventは、リスナーはActionListenerインターフェイスを実装し、それ自体をコンポーネントに登録する必要があります。さらに、コンポーネントは、リスナーにイベントを通知するために、リスナーを追跡する必要があります。

このActionEvent例をモデルとして使用することで、コンポーネントがイベントを生成し、リスナーがイベントをリッスンするために必要な要素を簡単に確認できます。大まかに言うと、次の3つの要素があります。

  1. コンポーネント
  2. イベントクラス
  3. リスナーインターフェイス

それぞれを個別に見てみましょう。

コンポーネント

コンポーネントはイベントを生成します。イベントは、何かが起こったことをリスナーに知らせるコンポーネントの方法です。したがって、コンポーネントは、イベントリスナーを登録および登録解除するメカニズムを提供する必要があります。コンポーネントは、リスナーを追跡し、それらのリスナーにイベントを渡す必要もあります。

登録/登録解除および追跡の仕組みは、個々のコンポーネントに任されています。しかし、コンポーネントが通常有するであろうaddXXXListenerremoveXXXListener、それが生成するイベントの種類ごと。内部的には、コンポーネントは選択した方法でリスナーを格納できます。ただし、通常、コンポーネントはリスナーをjava.util.Vectorまたはに格納しますjavax.swing.event.EventListenerList。リスナーにイベントを発生させるために、コンポーネントはリスナーのリストをループし、リスナーのイベントディスパッチメソッドを呼び出すことによって各リスナーにイベントを渡します。

例を挙げましょう。

... EventListenerList xxxListeners = new EventListnerList(); public void addXXXListener(XXXListener listener) { xxxListeners.add(XXXListener.class, listener); } public void removeXXXListener(XXXListener listener) { xxxListeners.remove(XXXListener.class, listener); } protected void fireXXX(XXXEvent xxxEvent) { Object[] listeners = xxxListeners.getListenerList(); // loop through each listener and pass on the event if needed Int numListeners = listeners.length; for (int i = 0; i
    

This example shows how to register, deregister, and fire events of type XXXEvent. Listeners can register and deregister themselves through the addXXXListener() and removeXXXListener() methods. When an event occurs, the component creates an event object and passes it to the fireXXX() method, where it is passed to the listeners.

The example defines a generic recipe that all components can follow. However, in order for the example to work, you must define an XXXEvent and an XXXListener interface.

The event class

The event holds all of the information necessary for a listener to figure out what happened. The information included is really event specific. Just think about the event carefully and design the event class to hold whatever information is necessary to fully describe the event to a listener. Events normally extend the java.awt.AWTEvent event class.

The listener interface

An event listener interface defines the methods used by a component to dispatch events. Each event type will have at least one corresponding dispatch method in a listener interface.

A listener interface takes the following generic format:

public interface XXXListener extends EventListener { // event dispatch methods somethingHappened(XXXEvent e); somethingElseHappened(XXXEvent e); ... } 

To listen for an event, a listener must implement the XXXListener interface and register itself with the component. When an event occurs, the component will call the proper dispatch method. The methods are defined in an interface so that any object can receive the event. As long as the listener implements the interface, the component will know how to dispatch the event to the listener.

Wrap-up

As you can see, there are dependencies between some of the pieces. The listener interface corresponds directly to the event. The event is necessarily the dispatch method's argument.

The component corresponds directly with the event and listener. It needs to know about each so that it can create events, dispatch events, and register listeners.

Unlike the other two pieces, the event object is independent. As a result, many components are free to fire off the event type. Furthermore, multiple interfaces may define methods to dispatch the event.

Tony Sintes is a principal consultant at BroadVision. Tony, a Sun-certified Java 1.1 programmer and Java 2 developer, has worked with Java since 1997.

This story, "Events and listeners" was originally published by JavaWorld .