段階 4 - グラフィック・オブジェクトの操作

4 番目の手順である Sample4.java ファイル ( <installdir> /jviews-framework89/codefragments/getstart/index.html を参照) は、Sample3 ファイルを拡張したものです。Sample4.java ファイルをコンパイルし、前の例の場合と同じように実行します。「例の実行」を参照してください。
sample4.png
サンプル 4 の実行

グラフィック・オブジェクトの追加

グラフィック・オブジェクトを操作できるようにするには、まずグラフィック・オブジェクトがある Rogue Wave® JViews パッケージをインポートする必要があります。
import ilog.views.graphic.*;
この例では、 IlvIcon クラスの 10 個のオブジェクトをマネージャーに追加する addObjects メソッドを実装します。
public void addObjects() 
{ 
  manager.setSelectable(0, false);

    for (int i = 0 ; i < 10 ; i++) {
        IlvGraphic obj = new IlvIcon("image.gif", new IlvRect(0,0,37,38));
       manager.addObject(obj, 1, false);
    }
}
このメソッドの最初の行は、パラメーターが 0false のマネージャーの setSelectable メソッドを呼び出します。
manager.setSelectable(0, false);
最初のパラメーター 0 は、メソッドを適用するマネージャーのレイヤーを指定します。2 番目のパラメーター false は、最初のパラメーターとしてパスされたレイヤーのオブジェクトが選択可能 (true) か否か (false) を指定します。
マネージャーのオブジェクトは別々のレイヤーに格納でき、インデックス別に識別されます。レイヤーはインデックス 0 から始まり、それぞれの上に描画されます。最初のレイヤーにはインデックス 0 が、2 番目のレイヤーにはインデックス 1 がというように割り当てられ、上位画面レイヤーに格納されたオブジェクトは、下位レイヤーのオブジェクトの前に表示されます。
マネージャーに読み込まれた lou.ivl ファイルでは、絵を構成するオブジェクトはレイヤー 0 に格納されます。パラメーターとして 0false を使用した setSelectable メソッドの呼び出しは、絵 (レイヤー 0) の選択が不可能で、そのため変更も不可能であることを指定します。
次の addObject メソッドは、IlvIcon オブジェクトをマネージャーのレイヤー 1 に追加します。
manager.addObject(obj, 1, false);
アプリケーション開始メソッドから addObjects() メソッドを呼び出します。この場合、Sample4 メソッドです。
メモ
このメソッドの false パラメーターは、再描画がトリガーされないことを指定します。このコードが実行されるときアプリケーションは表示されないため、ここでは再描画は必要ありません。
マウスでオブジェクトをクリックし、アプリケーションのインターフェースをテストします。絵の選択または変更はできませんが、新規のオブジェクトは選択可能であることがわかります。

グラフィック・オブジェクトの移動

Sample4 には、 IlvIcon オブジェクトをランダムに移動するために使用する appButtons() メソッドに新規ボタンがあります。
 Button moveButton = new Button("move");
 moveButton.setBackground(Color.gray);
 moveButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        moveObjects();
      }
    });
    buttons.add(moveButton);
  }
オブジェクトの移動は、Sample4.moveObjects() メソッドで実装されます。このメソッドはレイヤー 1 に含まれる列挙オブジェクト (新規オブジェクト) を取得し、これらの各オブジェクトに対してレイヤー 0 のオブジェクトをランダム検索し、 IlvManager を呼び出して、レイヤー 1 のオブジェクトをレイヤー 0 のオブジェクトの中央に移動します。
void moveObjects() { 
  IlvGraphic state=null, obj=null; 
  // get objects in layer 1 
  IlvGraphicEnumeration objects, states; 
  for (objects = manager.getObjects(1); objects.hasMoreElements();) { 
    obj = objects.nextElement();
    // get an random object in layer 0 
    states = manager.getObjects(0); 
    int index = (int)((double)manager.getCardinal(0)*Math.random());
    state = states.nextElement();
    for (int i = 1 ; i < index; i++) 
      state = states.nextElement();
    if (state != null) {
      // move the object.
      IlvRect bbox = state.boundingBox(null);
      manager.moveObject(obj, bbox.x+bbox.width/2,
                              bbox.y+bbox.height/2, true);
    }
  }
}