TableViewerのイベント処理
Taskビューでは,ビュー内の項目を選択すると,該当するエディタの場所にジャンプする。また,Error Logビューでは,項目をダブルクリックすることで,そのエラーの詳細がダイアログで表示される。これらのビューは,TableViewerを使用してつくられているので,これらの動作はTableViewerのイベント処理として実装される。ここでは,TableViewerについて代表的なイベントの処理方法を紹介する。
まずは表の操作で代表的な選択のイベントから取り上げよう。マウスによるクリック,あるいはキーボードのカーソルキーによる選択位置の変更を行った際には,選択変更イベントが発生する。選択変更イベントをハンドリングするには,ISelectionChangedListenerインタフェースの実装クラスを作成し,そのオブジェクトをTableViewerオブジェクトのaddSelectionChangedListenerメソッドを使って登録する。
TableViewer viewer = ...;
viewer.addSelectionChangedListener(
new ISelectionChangedListener() {
public void selectionChanged(
SelectionChangedEvent event) {
// イベント処理
System.out.println("addSelectionChangedListener");
}
});
addSelectionChangedListenerメソッドでISelectionChangedListenerオブジェクトを登録した場合,選択位置が変更される度にselectionChangedメソッドが呼び出される。つまり,キーボードのカーソルキーを押しっぱなしにしてオートリピートさせたときは,一行一行イベントが発生してしまう。もちろん悪いことではなく,基本的にはこれを使用して問題ない。
しかし,イベント処理がある程度重い処理だった場合,いちいち各行でイベントが発生してしまっては問題がある場面もある。オートリピートが終了したとき,つまりユーザの操作が完了したときに最終的に選択されている行に対してイベント処理を行いたい場合は,addPostSelectionChangedListenerメソッドを使用することにより実現できる。
TableViewer viewer = ...;
viewer.addPostSelectionChangedListener(
new ISelectionChangedListener() {
public void selectionChanged(
SelectionChangedEvent event) {
// イベント処理
System.out.println("addPostSelectionChangedListener");
}
});
addPostSelectionChangedListenerメソッドを使ってリスナーを登録した場合は,連続して発生する選択イベントの最後に発生したもののみがリスナーに渡される。addSelectionChangedListenerメソッドでのリスナー登録と併用することもできる。上記の実行結果はこんな感じになる。
addSelectionChangedListener
addSelectionChangedListener
addSelectionChangedListener
addPostSelectionChangedListener ← ちょっと遅れて表示
最後に,項目のダブルクリックしたときのイベントのハンドリングは,addDoubleClickListenerメソッドにIDoubleClickListenerオブジェクトを登録することにより実現できる。
TableViewer viewer = ...;
viewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
// イベント処理
}
});
IDoubleClickListener実装クラスのdoubleClickメソッド内に,イベント処理を記述する。ちなみに,キーボードの[Enter]キーを押したときにも,このダブルクリックイベントが発生する。
注意すべき点として,特に選択イベントに関しては,あくまでユーザの操作によってイベントが発火する,ということがある。TableViewerに渡しているSWTのTableオブジェクトに対して直接selectメソッドで選択させても,選択イベントは発火しない。Swingとは大きく異なる動作なので,把握しておく必要ありである。
| 固定リンク
この記事へのコメントは終了しました。
コメント