TITLE:EventListenerを実装して独自イベント作成

EventListenerを実装して独自イベント作成

編集者:Terai Atsuhiro~

作成日:2004-01-26
更新日:2022-07-31 (日) 21:36:32
  • category: swing folder: EventListener title: EventListenerを実装して独自イベント作成 tags: [EventListener, EventListenerList] author: aterai pubdate: 2004-01-26 description: イベント(イベントオブジェクト、イベントリスナー、イベントソース)を新たに作成し、これを使用します。 image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTMNwgwo5I/AAAAAAAAAY0/lpZGrcgRE8g/s800/EventListener.png

概要

イベント(イベントオブジェクト、イベントリスナー、イベントソース)を新たに作成し、これを使用します。

概要

イベント(イベントオブジェクト、イベントリスナー、イベントソース)を新たに作成し、これを使用します。

サンプルコード

#spanend
#spanadd
interface FontChangeListener extends EventListener {
#spanend
  public void fontStateChanged(FontChangeEvent e);
#spanadd
}
#spanend

#spandel
#screenshot
#spanend
#spanadd
class FontChangeEvent extends EventObject {
#spanend
  private final String command;
  private final Font font;
  public String getCommand() {
    return command;
  }

#spandel
**サンプルコード [#a2ffd4f4]
#spanend
#spandel
#code{{
#spanend
 private final Vector listenerList = new Vector();
 public void addFontChangeListener(FontChangeListener l) {
   if(!listenerList.contains(l)) listenerList.add(l);
 }
 public void removeFontChangeListener(FontChangeListener l) {
   listenerList.remove(l);
 }
 public void fireFontChangeEvent(String cmd, Font font) {
   Vector list = (Vector)listenerList.clone();
   Enumeration e = list.elements();
   FontChangeEvent evt = new FontChangeEvent(this, cmd, font);
   while(e.hasMoreElements()) {
     FontChangeListener listener = (FontChangeListener)e.nextElement();
     listener.fontStateChanged(evt);
   }
   revalidate();
 }
  public Font getFont() {
    return font;
  }
#spanadd

#spanend
  public FontChangeEvent(Object source, String cmd, Font font) {
    super(source);
    this.command = cmd;
    this.font = font;
  }
#spanadd
}
#spanend
#spanadd
// ...
#spanend
#spanadd
private final Vector listenerList = new Vector();
#spanend
#spanadd

#spanend
#spanadd
public void addFontChangeListener(FontChangeListener l) {
#spanend
  if (!listenerList.contains(l)) {
    listenerList.add(l);
  }
#spanadd
}
#spanend
#spanadd

#spanend
#spanadd
public void removeFontChangeListener(FontChangeListener l) {
#spanend
  listenerList.remove(l);
#spanadd
}
#spanend
#spanadd

#spanend
#spanadd
public void fireFontChangeEvent(String cmd, Font font) {
#spanend
  Vector list = (Vector) listenerList.clone();
  Enumeration e = list.elements();
  FontChangeEvent evt = new FontChangeEvent(this, cmd, font);
  while (e.hasMoreElements()) {
    FontChangeListener listener = (FontChangeListener) e.nextElement();
    listener.fontStateChanged(evt);
  }
  revalidate();
#spanadd
}
#spanend
View in GitHub: Java, Kotlin
  • &jnlp;
  • &jar;
  • &zip;

解説

上記のサンプルではメニューからのイベントでコンポーネントのフォントを変更しています。フォントの初期値はイベントリスナーをimplementsしたクラスのコンストラクタで指定しています。

解説

上記のサンプルではJMenuItemに設定したイベントでコンポーネントのフォントを変更できます。ラベルとボタンをその独自イベントのリスナーとして追加しているので、fireFontChangeEvent(...)メソッド内でそれらのフォントサイズが変更可能です。 Javaのイベントモデルは、delegation event model(委譲型のイベントモデル)です。以下の参考リンクなどで詳細をチェックしてみてください。 Javaのイベントモデルは、delegation event model(委譲型のイベントモデル)です。
  • - リスナーの保存にVectorではなくEventListenerListを使用する場合はEventListenerListドキュメントのサンプルが参考になります。

参考リンク

  • イベント
  • イベント処理 - delegation event model
    #spanend
    #spanadd
    // https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/event/EventListenerList.html
    #spanend
    #spanadd
    EventListenerList listenerList = new EventListenerList();
    #spanend
    #spanadd
    // FontChangeEvent fontChangeEvent = null;
    #spanend
    #spanadd
    public void addFontChangeListener(FontChangeListener l) {
    #spanend
      listenerList.add(FontChangeListener.class, l);
    #spanadd
    }
    #spanend
    #spanadd
    public void removeFontChangeListener(FontChangeListener l) {
    #spanend
      listenerList.remove(FontChangeListener.class, l);
    #spanadd
    }
    #spanend
    #spanadd
    // Notify all listeners that have registered interest for
    #spanend
    #spanadd
    // notification on this event type.The event instance
    #spanend
    #spanadd
    // is lazily created using the parameters passed into
    #spanend
    #spanadd
    // the fire method.
    #spanend
    #spanadd
    protected void fireFontChangeEvent(String cmd, Font font) {
    #spanend
      // Guaranteed to return a non-null array
      Object[] listeners = listenerList.getListenerList();
      FontChangeEvent evt = new FontChangeEvent(this, cmd, font);
      // Process the listeners last to first, notifying
      // those that are interested in this event
      for (int i = listeners.length - 2; i >= 0; i -= 2) {
        if (listeners[i] == FontChangeListener.class) {
          // Lazily create the event:
          // if (fontChangeEvent == null)
          //   fontChangeEvent = new FontChangeEvent(this);
          ((FontChangeListener) listeners[i + 1]).fontStateChanged(evt);
        }
      }
    #spanadd
    }
    #spanend
    #spanadd
    

コメント

参考リンク

コメント