イベントおよびリスナー

Rogue Wave® JViews は、さまざまなタイプのイベントをサポートし、アプリケーションでイベントに反応するリスナーを追加できるようにします。多くの場合、こうしたカスタム・イベント・リスナーは、Rogue Wave JViews 内部コードではなく、パフォーマンス上のボトルネックとなります。したがって、リスナー・コードを慎重に設計して、インストールするリスナーが多すぎないようにする必要があります。

調整セッション

ほとんどの Rogue Wave JViews イベントは、調整フラグをサポートします。データに大きな変更があると、一連のイベントがトリガーされ、すべてのイベントが同じシーケンスに属していることが調整フラグで示されます。これにより、リスナーの実装に際しては、それぞれの単一のイベントに対して経済的な操作が行われ、不経済的な操作は一連のイベントの終わりに実行されるように設定できます。すべての Rogue Wave JViews 内部リスナーは、このように設計されているので、できれば自身のリスナーにも同じ設計原則を使用するようにお勧めします。
アプリケーションがマネージャーで大きな変更を実行する場合は、以下のように調整セッションを使用するようにお勧めします。
manager.setContentsAdjusting(true);
try {
  ... add, remove, move a lot of objects... 
} finally {
  manager.setContentsAdjusting(false);
}
この調整セッション内部で発生したイベントは、すべて調整フラグが有効となっているため、調整フラグをサポートするすべてのリスナーが最適化された方法で実行されることになります。詳しくは、「マネージャー内容のリスナー」を参照してください。
アプリケーションが大きなセットのオブジェクトを選択または選択解除する場合は、同様の方法で選択調整セッションを使用します。
manager.setSelectionAdjusting(true);
try {
  ... select or deselect a lot of objects... 
} finally {
  manager.setSelectionAdjusting(false);
}
メモ
次のように調整セッションと再描画セッションを結合することは、ごく一般的です。
manager.setContentsAdjusting(true);
manager.initReDraws();
try {
  ... add, remove, move a lot of objects... 
} finally {
  manager.setContentsAdjusting(false);
  manager.reDrawViews();
}
JViews Diagrammer を使用した場合、下位レベル API IlvManager.setContentsAdjusting を使用する必要はなく、代わりに上位レベル API IlvDiagrammer.setAdjusting および IlvSDMEngine.setAdjusting を使用してください。こうした上位レベル API は、マネージャーの調整フラグおよび選択調整フラグの内容を自動的に処理します。

調整セッションの場合のリスナーの実装

イベント・リスナーを実装する必要がある場合、クイック・タスクを調整セッション内で実行し、スロー・タスクを調整セッションの終わりでのみ実行するようにお勧めします。これにより、スロー・タスクの実行回数が少なくなるので、アプリケーション全体がスローダウンしません。 以下にリスナーの標準的スキームを示します。
listener = new ManagerContentChangedListener() {
  int numAdditions = 0;
  int numRemovals = 0;
  public void contentsChanged(ManagerContentChangedEvent evt) {
    if (evt.isAdjusting()) {
      // inside an event series: quick operation, e.g. updating a counter
      switch (evt.getType()) {
        case ManagerContentChangedEvent.OBJECT_ADDED:
          numAdditions++;
          break;
        case ManagerContentChangedEvent.OBJECT_REMOVED:
          numRemovals++;
          break;
      }
    } else (evt.getType() == ManagerContentChangedEvent.ADJUSTMENT_END) {
      // at the end of the series: can do a slow operation
      reorganizeSomeData(numAdditions, numRemovals);
      numAdditions = numRemovals = 0;
    } else {
      // outside a series of events, need to do the full operation immediately
      switch (evt.getType()) {
        case ManagerContentChangedEvent.OBJECT_ADDED:
          reorganizeSomeData(1, 0);
          break;
        case ManagerContentChangedEvent.OBJECT_REMOVED:
          reorganizeSomeData(0, 1);
          break;
      }
    }
  }

ディスパッチ・リスナー

自身のグラフィック・オブジェクトを実装する場合、そのグラフィック・オブジェクト自体が選択された時点である種のコードを実行したいことが時としてあります。 グラフィック・オブジェクト自体を選択リスナーとして登録できますが、この種のオブジェクトを 1000 個マネージャーに追加すると、マネージャーは 1000 個の選択リスナーを持つことになります。この場合、イベントを選択されたオブジェクトにディスパッチする 1 つのディスパッチ・リスナー (1000 個のオブジェクトに対して 1 つのリスナー) を使用するほうが効果的です。Rogue Wave JViews には、こうしたディスパッチ・リスナーを実装するのに適した抽象補助クラス IlvManagerSelectionDispatcher が含まれます。