Swing/EventListener のバックアップの現在との差分(No.18)
TITLE:EventListenerを実装して独自イベント作成
EventListenerを実装して独自イベント作成
Posted by terai at 2004-01-26- category: swing folder: EventListener title: EventListenerを実装して独自イベント作成 tags: [EventListener, EventListenerList] author: aterai pubdate: 2004-01-26 description: イベント(イベントオブジェクト、イベントリスナー、イベントソース)を新たに作成し、これを使用します。 image:
概要
イベント(イベントオブジェクト、イベントリスナー、イベントソース)を新たに作成し、これを使用します。Screenshot
Advertisement
概要
イベント(イベントオブジェクト、イベントリスナー、イベントソース)を新たに作成し、これを使用します。サンプルコード
#spanend
#spanadd
interface FontChangeListener extends EventListener {
#spanend
public void fontStateChanged(FontChangeEvent e);
#spanadd
}
#spanend
-&jnlp;
-&jar;
-&zip;
#spanadd
class FontChangeEvent extends EventObject {
#spanend
private final String command;
private final Font font;
public String getCommand() {
return command;
}
#spandel
#screenshot
#spanend
public Font getFont() {
return font;
}
#spandel
**サンプルコード [#a2ffd4f4]
#spanend
#spandel
#code{{
#spanend
public FontChangeEvent(Object source, String cmd, Font font) {
super(source);
this.command = cmd;
this.font = font;
}
#spanadd
}
#spanend
#spanadd
// ...
#spanend
private final Vector listenerList = new Vector();
#spanadd
#spanend
public void addFontChangeListener(FontChangeListener l) {
if(!listenerList.contains(l)) listenerList.add(l);
if (!listenerList.contains(l)) {
listenerList.add(l);
}
}
#spanadd
#spanend
public void removeFontChangeListener(FontChangeListener l) {
listenerList.remove(l);
}
#spanadd
#spanend
public void fireFontChangeEvent(String cmd, Font font) {
Vector list = (Vector)listenerList.clone();
Vector list = (Vector) listenerList.clone();
Enumeration e = list.elements();
FontChangeEvent evt = new FontChangeEvent(this, cmd, font);
while(e.hasMoreElements()) {
FontChangeListener listener = (FontChangeListener)e.nextElement();
while (e.hasMoreElements()) {
FontChangeListener listener = (FontChangeListener) e.nextElement();
listener.fontStateChanged(evt);
}
revalidate();
}
View in GitHub: Java, Kotlin解説
上記のサンプルではメニューからのイベントでコンポーネントのフォントを変更しています。フォントの初期値はイベントリスナーを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