Java/swing/サンプル/オリジナルのイベントを作ろう


サンプルダウンロード


オリジナルのイベントを作るのは7つのステップを踏む必要があります

以下で1つずつ簡単に解説してみました。

1.イベントオブジェクト

Public class MyEvent extends EventObject {
  public MyEvent(Object source) {
    super(source);
  }
}
 
  • 上記のような、イベントで通知したい内容を格納するイベントオブジェクトを用意しましょう。
    • 上記の例は、ソースのコンポーネントだけを格納しています。
    • 必要に応じて、コンストラクタのパラメータやクラス変数を増やしましょう。

2.イベントリスナー

interface MyEventListener extends EventListener {
  public void myEvent(MyEvent myEvent);
}
 
  • 正確にはイベントリスナーを実装するためのインターフェイスが必要です。
  • インターフェイスは「EventListener」を継承し、オリジナルイベントに必要なメソッドを定義します。
    • これを利用者に提供して、リスナーを実装してもらいます。

3.イベントを管理する変数

Public class MyEventFrame extends JFrame {
  /**
   * リスナーを管理する変数
   */
  EventListenerList evList = new EventListenerList();
}
 
  • まずイベントを実装するコンポーネントを作成し、その中にリスナーを管理する変数を作成します。
    • リスナーを管理する変数は、EventListenerListとVecterを使えるそうです。
      • EventListenerListが簡単に使えて便利だと思いました。

4.リスナーを追加するメソッド

public void addMyEventListener(MyEventListener l) {
    evList.add(MyEventListener.class, l);
  }
 
  • ステップ3で作ったリスナーを管理する変数にリスナーを追加する処理を作成します。

5.リスナーを削除するメソッド

public void removeMyEventListener(MyEventListener l) {
    evList.remove(MyEventListener.class, l);
  }
 
  • ステップ4で追加されたリスナーを削除する処理を作成します。

6.イベントリスナーを叩くメソッド

protected void fireMyEvent(Object source) {
    // マイイベントオブジェクトを作成します
    MyEvent myEventObject = new MyEvent(source);
 
    // イベントリスナーリストから、マイイベントリスナーを取得します
    MyEventListener[] listeners = evList.getListeners(MyEventListener.class);
 
    // 取得したマイイベントリスナーでループを回し
    for (MyEventListener myEventListener : listeners) {
      // イベントに該当するメソッドを呼び出します
      myEventListener.myEvent(myEventObject);
    }
  }
 
  • イベントに必要なパラメータを受け取り、イベントオブジェクトを作成
  • 対象となるイベントリスナー全てに対して、対応するメソッドの呼び出しを行います。


7.イベントを発行する処理

JButton b = new JButton("押してね!");
    b.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        // 「押してね!」ボタンを押したらマイイベントが発生します
        fireMyEvent(e.getSource());
      }
    });
 
  • 何が起きた時にイベントを発生させるのか、自分で考えて作る必要があります。
  • 今回は簡単に、ボタンが押されてActionListener#actionPerformedが呼び出されたらイベントを発行するようにしました。
  • 以上の7ステップをよいしょよいしょと作ると、オリジナルイベントを作れる筈です。


逆から考えると

上記では、末端から順にオリジナルイベントに必要な物を作成していきましたが、逆から考えたほうが理解はスムーズだと思います。

1.イベントを発行する処理

  • オリジナルのイベントを発生させたいのですから、イベントを発生させたいタイミングがあると思います。
  • イベントを発生させたいタイミングと、イベントに渡してあげたいパラメータを考えるのがステップ1になりまする
    • タイミングとパラメータが決まったら、「fireXXXX」なんてメソッドを作ってパラメータを渡しましょう。

2.イベントリスナーを叩く処理

  • 「fireXXXX」の中では、まず受け取ったパラメータをイベントオブジェクトの中に詰め込みます。
    • ※オリジナルのイベントオブジェクトを作りましょう。
  • リスナーを管理する変数から、対象となるリスナーを取り出します。
    • ※リスナーを管理する変数と、オリジナルのイベントリスナー(インターフェイス)を作りましょう。
  • 取り出したリスナー全てに対し、対象となるイベントのメソッドを呼び出します。
    • ここで、リスナーの中に実装した処理にイベントオブジェクトが渡されて実行されることになります。

3.イベントリスナーを追加、削除するメソッド

  • ステップ1と2でほとんどの処理が出来ていますが、追加、削除するメソッドがないと、利用者がリスナーを追加できなくて困ってしまいます。

サンプルソース

  • というわけでステップ1~7と、それを利用するサンプルソースです。
    • ボタンをクリックするとオリジナルのイベントを発生させて、
    • リスナーの中に実装した、ボタンの名前をダイアログに表示する処理が動きます。
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.EventListener;
import java.util.EventObject;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.event.EventListenerList;
 
/**
 * オリジナルイベントを発行するサンプル
 */
public class MyEventSample extends JFrame {
  public static void main(String[] args) {
    // オリジナルイベントを実装したマイイベントフレーム作成
    MyEventFrame f = new MyEventFrame();
 
    // オリジナルイベント用のイベントリスナーを作成&追加
    f.addMyEventListener(new MyEventListener() {
 
      @Override
      public void myEvent(MyEvent myEvent) {
        // イベントが発生したらダイアログで、クリックされたボタンの名前を表示します
        JButton b = (JButton)myEvent.getSource();
        JOptionPane.showMessageDialog(b, "ボタンの名前は「" + b.getText() + "」です。");
      }
    });
 
    f.setVisible(true);
  }
}
 
/**
 * オリジナルイベントに必要な物 その1 イベントオブジェクト
 * イベントが発行時にリスナーに伝えたい事をイベントオブジェクトに格納して渡します
 */
class MyEvent extends EventObject {
  public MyEvent(Object source) {
    super(source);
  }
}
 
/**
 * オリジナルイベントに必要な物 その2 イベントリスナー
 * 正確にはイベントリスナーを実装するためのインターフェイスが必要です。
 * これを利用者に提供して、リスナーを実装してもらいます。
 */
interface MyEventListener extends EventListener {
  public void myEvent(MyEvent myEvent);
}
 
 
 
class MyEventFrame extends JFrame {
  /**
   * オリジナルイベントに必要な物 その3 リスナーを管理する変数
   * リスナーを管理するのはEventListenerListを使う方法と、Vecterなどのリストで管理する方法があるようです。
   * EventListenerListが簡単に使えて便利だと思います。
   */
  /**
   * リスナーを管理する変数
   */
  EventListenerList evList = new EventListenerList();
 
  /**
   * オリジナルイベントに必要な物 その4 リスナーを追加するメソッド
   * @param l マイイベントリスナー
   */
  public void addMyEventListener(MyEventListener l) {
    evList.add(MyEventListener.class, l);
  }
 
  /**
   * オリジナルイベントに必要な物 その5 リスナーを削除するメソッド
   * @param l マイイベントリスナー
   */
  public void removeMyEventListener(MyEventListener l) {
    evList.remove(MyEventListener.class, l);
  }
 
  /**
   * オリジナルイベントに必要な物 その6 イベントリスナーを叩くメソッド
   * 1.イベントに必要なパラメータを受け取り、イベントオブジェクトを作成
   * 2.対象となるイベントリスナー全てに対して、対応するメソッドの呼び出しを行います。
   */
  protected void fireMyEvent(Object source) {
    // マイイベントオブジェクトを作成します
    MyEvent myEventObject = new MyEvent(source);
 
    // イベントリスナーリストから、マイイベントリスナーを取得します
    MyEventListener[] listeners = evList.getListeners(MyEventListener.class);
 
    // 取得したマイイベントリスナーでループを回し
    for (MyEventListener myEventListener : listeners) {
      // イベントに該当するメソッドを呼び出します
      myEventListener.myEvent(myEventObject);
    }
  }
 
  /**
   * オリジナルイベントに必要な物 その7 イベントを発行する処理
   * 何が起きた時にイベントを発生させるのか、自分で考えて作る必要があります。
   * 今回は簡単に、ボタンが押されてActionListener#actionPerformedが呼び出されたらイベントを発行するようにしました。
   */
  public MyEventFrame() {
    setTitle("独自イベントを発行するサンプル");
    setBounds(200, 100, 300, 200);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
 
    JButton b = new JButton("押してね!");
    b.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        // 「押してね!」ボタンを押したらマイイベントが発生します
        fireMyEvent(e.getSource());
      }
    });
    add(b);
 
    setVisible(true);
  }
}
 
 

サンプルダウンロード


コメント

名前:

添付ファイル