段階 3 - イベントの使用

段階 3 の概要

チュートリアルの第 3 段階である Sample3.java ファイル ( <installdir> /jviews-framework89/codefragments/getstart/index.html を参照) は、Sample2 ファイルを拡張したものです。Sample3.java ファイルをコンパイルし、前の例の場合と同じように実行します。「例の実行」を参照してください。
sample3.png
サンプル 3 の実行
イベントを利用するには、 InteractorListener インターフェースを使用してインタラクター変更の通知を受けます。例には 3 つのボタンがあり、それぞれがインタラクターに関連付けられています。ボタンを順番にクリックすると、それに応じて「使用中」のインタラクターが変わります。
次の 2 つの新規インタラクターがビューに配置されます。 IlvZoomViewInteractor および IlvUnZoomViewInteractor. これらのインタラクターを使用すると、ビュー内の矩形をドラッグし、この領域で拡大/縮小できます。3 番目のインタラクターは (Sample2 の) IlvSelectInteractor。 それぞれのボタンは、上の図に表示されるようにボタンを自動的に整列する Swing JPanel の中に作成されます。

新規インタラクター・フィールドの追加

タスクを実行するには、InteractorListener を実装するクラス定義を変更し、zoomInteractor および unzoomInteractor フィールドを追加して、必要なインタラクター・ボタン・フィールドを Sample3 アプリケーションに追加します。
public class Sample3 extends JFrame
implements InteractorListener 
{ 
  IlvManager manager; 
  IlvManagerView mgrview;
  IlvSelectInteractor selectInteractor;
  IlvManagerViewInteractor zoomInteractor, unZoomInteractor;
  Button selectButton, zoomButton, unZoomButton;
  ....
}

インタラクター・ボタンの作成

createInteractorButtons メソッドは、オブジェクトの selectButtonzoomButton、および unZoomButton フィールドに保存する 3 つのボタン (選択、-、および +) を作成します。
インタラクター・ボタンの作成
void createInteractorButtons() { 
  Panel buttons = new Panel();
  selectButton = new Button("Select"); 
  selectButton.setBackground(Color.gray); 
  selectButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
      if (selectInteractor == null)
        selectInteractor = new IlvSelectInteractor();
      if (mgrview.getInteractor() != selectInteractor) 
          mgrview.setInteractor(selectInteractor);
      }
    }
  });
 
  buttons.add(selectButton);
  unZoomButton = new Button("-");
  unZoomButton.setBackground(Color.gray);
  unZoomButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) {
      if (unZoomInteractor == null)
        unZoomInteractor = new IlvUnZoomViewInteractor(); 
      if (mgrview.getInteractor() != unZoomInteractor)  
        mgrview.setInteractor(unZoomInteractor);
    }
  });
 
  buttons.add(unZoomButton);
  zoomButton = new Button("+");
  zoomButton.setBackground(Color.gray);
  zoomButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) {
      if (zoomInteractor == null)
        zoomInteractor = new IlvZoomViewInteractor();
      if (mgrview.getInteractor() != zoomInteractor) 
       mgrview.setInteractor(zoomInteractor);
    }
  }); 
  buttons.add(zoomButton); 
  getContentPane().add(buttons, BorderLayout.SOUTH); 
}
これで使用可能なインタラクターが 3 つになりました。そのため、ボタンをクリックしてアクションを実行すると、前にインストールしたインタラクターが削除され、IlvManagerView クラスの setInteractor メソッドを呼び出すと、新規のインタラクターがインストールされます。

インタラクターの変更を通知する

Sample3.java ファイルでは、クラスが InteractorListener インターフェースを実装することがわかります。また、Rogue Wave JView のイベント・クラスが含まれるパッケージである、新規パッケージ package-summary をインポートしたこともお気付きでしょう。InteractorListener インターフェースには、次のメソッドがあります。
この例では、対応するインタラクターがビューに付加されると選択ボタンが赤になるようにします。
interactorChanged メソッドは、ビュー上のインタラクターが変わると呼び出されます (オブジェクト (Sample3 のインスタンス) がリスナーとして登録された直後。「リスナーの登録」を参照してください)。パラメーターは新旧のインタラクターがあるイベントです。新規にインストールされたインタラクターに対応するボタンの背景色を赤に変更します。
インタラクター・ボタンの色を変更する
public void interactorChanged(InteractorChangedEvent event)
{
     IlvManagerViewInteractor oldI = event.getOldValue();
     IlvManagerViewInteractor newI = event.getNewValue();

     if (oldI == selectInteractor)
       selectButton.setBackground(Color.gray);
     else if (oldI == zoomInteractor)
       zoomButton.setBackground(Color.gray);
     else if (oldI == unZoomInteractor)
       unZoomButton.setBackground(Color.gray);

     // there is no new interactor
     if (newI == null)
       return;
     if (newI == selectInteractor)
       selectButton.setBackground(Color.red);
     else if (newI == zoomInteractor)
       zoomButton.setBackground(Color.red);
     else if (newI == unZoomInteractor)
       unZoomButton.setBackground(Color.red);
}

リスナーの登録

インターフェースの実装だけでは十分ではありません。この新規のリスナーをビューに登録する必要があります。これは、init メソッドでの addInteractorListener メソッドを呼び出して行います。
...
    manager = new IlvManager();
    try {
      manager.read("data/lou.ivl");
    } catch (Exception e) {}
    mgrview = new IlvManagerView(manager);
    setLayout(new BorderLayout(0,0));
    getContentPane().add(new IlvJScrollManagerView(mgrview),
                         BorderLayout.CENTER);
    createButtons();
    mgrview.addInteractorListener(this);
 ...