インタラクター・リスナー

ビューのアクティブ・インタラクターが変更されると、ビューは InteractorChangedEvent イベントを実行します。ビュー・インタラクターの変更についての通知を受け取るには、InteractorListener インターフェースをクラスで実装し、それ自体を、IlvManagerViewaddInteractorListener メソッドを使用して登録する必要があります。 removeInteractorListener メソッドを使用して、リスナーがそのようなイベントの通知を受け取らないように指定することもできます。
ビューのインタラクターが変更されると、ビューはリスナーの interactorChanged メソッドを呼び出します。
void interactorChanged(InteractorChangedEvent event)   
このメソッドは、新旧インタラクターに関する情報を含むパラメーターとしてクラス InteractorChangedEvent のインスタンスとともに呼び出されます。

例: DragRectangleInteractor クラスの実装

この例は、定義済みビュー・インタラクター IlvDragRectangleInteractor のメソッドを実装する方法を示しています。独自のインタラクター機能を作成する起点としてこの例を使用できます。クラス IlvDragRectangleInteractor は、ビューの矩形領域の指定に使用されます。この矩形を選択すると、 fireRectangleDraggedEvent メソッドが呼び出されます。次に、この矩形を派生インタラクターのさまざまな目的に使用できます。例えば、このインストラクターのサブクラスを作成し、指定領域を拡大できるようにします。この例の完全コードは、インストール済みの製品の codefragments/interactors/dragrectinter/src/DragRectangleInteractor.javaDragRectangleInteractor.java ファイルにあります。詳細については、 <installdir> /jviews-framework89/codefragments/interactors/dragrectinter/srchtml/DragRectangleInteractor.java.html を参照してください。
DragRectangleInteractor クラスは、startrectangle、および 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 変数に保存され、マネージャーの座標系に保存できるように変換されます。マウスを放すと、IlvManagerViewInteractordrawGhost メソッドが呼び出され、ゴースト・イメージを消去します。矩形の横と縦を 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));
  }
}