ボタンがクリックされるたびに特定の機能がコントロールによって実行されるように、いくつかのボタンを含むカスタム コントロールにセレクション リスナーを追加したいと考えています。問題は、リスナーをコントロール自体に追加することであり、子ボタンのそれぞれに個別に追加することではありません。私は何をすべきか?
1 に答える
SWT を使用して独自のウィジェットを作成する記事から:
SWT イベントメカニズム
SWT は、通常の Java の「型付き」リスナーだけでなく、低レベルのリスナー メカニズムも提供します。すべての SWT ウィジェットは、addListener(int eventType, Listener listener) と notifyListeners(int eventType, Event event) を認識します。eventType 定数はクラス SWT で定義されています。イベントが発生すると、ウィジェットは適切な型定数を含む SWT Event オブジェクトを作成します。notifyListeners メソッドは、Listener の handleEvent(Event event) を呼び出します。既存の SWT イベントを再利用する必要がある場合は、通常、このメカニズムを使用します。
たとえば、ウィジェットが選択イベントを実装している場合、次のように「型指定された」追加および削除メソッドを実装できます。
public void addSelectionListener(SelectionListener listener) { addListener(SWT.Selection, new TypedListener(listener)); } public void removeSelectionListener(SelectionListener listener) { removeListener(SWT.Selection, listener); }
ウィジェットで「選択イベント」が発生した場合 (たとえば、child1 が選択された場合)、notifyListeners を使用してアプリケーションの選択リスナーに通知します。
child1.addListener(SWT.Selection, new Listener() { public void handleEvent(Event e) { notifyListeners(SWT.Selection, new Event()); } });
リスナーを追加するときは、最初にそれを TypedListener にラップすることに注意してください。これは、TypedListener の handleEvent(Event event) メソッドが Event の型に基づいて適切な TypedEvent サブクラスを作成し、型指定されたイベントの適切なメソッドを呼び出すためです。このようにして、アプリケーションは Java 型のリスナーをウィジェットに追加できますが、ウィジェットの実装では、より効率的な低レベルのリスナー メカニズムを使用できます。ただし、ウィジェットの実装が型付きリスナー API を提供していることを確認してください。アプリケーションは、低レベルのリスナー メソッドを呼び出すべきではありません。型指定されたリスナー メソッドは、すべてのウィジェットがすべてのタイプのイベントを処理できると想定したり、Event クラスのすべてのフィールドがすべてのイベントに対して有効であると想定したりするなど、偶発的なプログラミング エラーを防ぎます。