ビューのアクティブ・インタラクターが変更されると、ビューは InteractorChangedEvent イベントを実行します。ビュー・インタラクターの変更についての通知を受け取るには、InteractorListener インターフェースをクラスで実装し、それ自体を、
IlvManagerView
の addInteractorListener メソッドを使用して登録する必要があります。 removeInteractorListener メソッドを使用して、リスナーがそのようなイベントの通知を受け取らないように指定することもできます。ビューのインタラクターが変更されると、ビューはリスナーの interactorChanged メソッドを呼び出します。
void interactorChanged(InteractorChangedEvent event)
このメソッドは、新旧インタラクターに関する情報を含むパラメーターとしてクラス InteractorChangedEvent のインスタンスとともに呼び出されます。
例: DragRectangleInteractor クラスの実装
この例は、定義済みビュー・インタラクター
IlvDragRectangleInteractor
のメソッドを実装する方法を示しています。独自のインタラクター機能を作成する起点としてこの例を使用できます。クラス IlvDragRectangleInteractor は、ビューの矩形領域の指定に使用されます。この矩形を選択すると、 fireRectangleDraggedEvent メソッドが呼び出されます。次に、この矩形を派生インタラクターのさまざまな目的に使用できます。例えば、このインストラクターのサブクラスを作成し、指定領域を拡大できるようにします。この例の完全コードは、インストール済みの製品の codefragments/interactors/dragrectinter/src/DragRectangleInteractor.java の DragRectangleInteractor.java ファイルにあります。詳細については、
<installdir>
/jviews-framework89/codefragments/interactors/dragrectinter/srchtml/DragRectangleInteractor.java.html を参照してください。DragRectangleInteractor
クラスは、start
、rectangle
、および dragging
属性を定義します。public class DragRectangleInteractor extends IlvManagerViewInteractor { /** The anchor point of the rectangle. */ private final IlvPoint start = new IlvPoint(); /** The rectangle when dragging. */ private final IlvRect rectangle = new IlvRect(); /** True if dragging. */ private boolean dragging = false; ... }
属性
start
はドラッグを開始するポイント、rectangle
はドラッグ時に描画される矩形、dragging
はユーザーがドラッグするときの値が true
であるブール型変数です。コンストラクター内で呼び出される
enableEvents
メソッドは、パラメーターとして MOUSE_EVENT_MASK
および MOUSE_MOTION_EVENT_MASK
を取ります。
イベントを有効にして、インタラクターで考慮できる状態にしておく必要があります。public DragRectangleInteractor() { enableEvents(AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK); }
processMouseEvent
メソッドは、次のように MOUSE_PRESSED
および MOUSE_RELEASED
イベントを処理します。protected void processMouseEvent(MouseEvent event) { switch (event.getID()) { case MouseEvent.MOUSE_PRESSED: { if (dragging) break; if ((event.getModifiers() & InputEvent.BUTTON2_MASK) == 0 && (event.getModifiers() & InputEvent.BUTTON3_MASK) == 0) { dragging = true; IlvTransformer t = getTransformer(); start.move(event.getX(), event.getY()); t.inverse(start); rectangle.width = 0; rectangle.height = 0; } break; } case MouseEvent.MOUSE_RELEASED: if (dragging) { dragging = false; drawGhost(); rectangle.width = 0; rectangle.height = 0; fireRectangleDraggedEvent(new IlvRect(rectangle), event); } } }
マウス・ボタンを押すと、マウス・ポインター座標が
start
変数に保存され、マネージャーの座標系に保存できるように変換されます。マウスを放すと、IlvManagerViewInteractor
の drawGhost
メソッドが呼び出され、ゴースト・イメージを消去します。矩形の横と縦を 0
に設定して、ゴーストがそれ以上描画されないようにし、fireRectangleDraggedEvent
メソッドを呼び出してドラッグ操作の終了を通知します。次のコードはドラッグされた矩形を示したものです。メモ
drawGhost メソッドは、一時的な描画を実行し、現在の操作アクションに対するフィードバックを得るために使用できます。
processMouseMotionEvents
は、次のように MOUSE_DRAGGED
イベントを処理します。protected void processMouseMotionEvent(MouseEvent event) { if (event.getID() == MouseEvent.MOUSE_DRAGGED && dragging) { drawGhost(); IlvTransformer t = getTransformer(); IlvPoint p = new IlvPoint(event.getX(), event.getY()); ensureVisible(p); rectangle.reshape(start.x, start.y, 0,0); t.inverse(p); rectangle.add(p.x, p.y); drawGhost(); } }
まず、
drawGhost
を呼び出して、矩形を消去します。ensureVisible
を呼び出すと、ドラッグしたポイントを画面上に確実に表示できます。新規の矩形がマネージャーの座標系で計算され、drawGhost
を呼び出して新規矩形を描画します。drawGhost
メソッドはドラッグされた矩形を描画するだけです。矩形はマネージャー座標系にあるため、メソッドは描画する前にビュー・トランスフォーマーを適用する必要があります。protected void drawGhost(Graphics g) { IlvRect rect = new IlvRect(rectangle); IlvTransformer t = getTransformer(); if (t != null) t.apply(rect); if (rect.width > 0 && rect.height >0) { g.drawRect((int)Math.floor(rect.x), (int)Math.floor(rect.y), (int)Math.floor(rect.width), (int)Math.floor(rect.height)); } }