コントロールなどの一般的な機能を提供するいくつかのパネルを実装することがよくあります。このために、呼び出し元がコントロールにアタッチして変更に関する通知を取得できるように、リスナーを追加できるようにしたいと考えています。
これまでのところ、リスナーを保持する独自のものを単純に使用してList
おり、アクションを起動したい場合は、リストをループしてリスナーを呼び出します。外から見ると、これは基本的に他のSwing
コントロールのように見えますが、これが本当に使用すべきアプローチであるかどうか疑問に思っていました.
特に、ループ内でリスナーを呼び出すことSwing
自体が行うことなのか、それともアクションを配置する何らかのキューがあり、そのSwing
ようなアクションを配信するタイミングを決定するのか疑問に思っていました。
これを調査したところ、次のコードに出くわしました。
protected void fireActionPerformed(ActionEvent event)
{
Object[] listeners = listenerList.getListenerList();
ActionEvent e = null;
// 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] instanceof ActionListener)
{
// Lazily create the event:
if (e == null)
{
String actionCommand = event.getActionCommand();
e = new ActionEvent(this,
ActionEvent.ACTION_PERFORMED,
actionCommand,
event.getWhen(),
event.getModifiers());
e.setSource(event.getSource());
}
((ActionListener)listeners[i+1]).actionPerformed(e);
}
}
}
listenerList
fromのメンバーJComponent
に直接アクセスするのは、少し奇妙に感じます。しかし、これまでのところ、より良い方法は見つかりませんでした。また、これに新しいリスナーを追加するときは、以下のようにしますが、これが本当に適切な方法かどうかはわかりません。
public void addQueryListener(ActionListener oListener)
{
listenerList.add(ActionListener.class, oListener);
}
public void removeQueryListener(ActionListener oListener)
{
listenerList.remove(ActionListener.class, oListener);
}
だから私は知りたいのですが、listenerList
リスナーを追加および削除する正しい方法でメンバーにアクセスしているので、他の標準コントロールと同じように動作しますか? またはbest practice
、これをどのように行うべきか、これまで見逃していたものがありますか?