TreeViewerクラスでツリー構造を扱う。
import org.eclipse.jface.viewers.TreeViewer;
int style = SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL; // int style = SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL; TreeViewer viewer = new TreeViewer(parent, style); viewer.setContentProvider(new MyContentProvider()); viewer.setLabelProvider(new MyLabelProvider()); viewer.setInput(root);
スタイルのSINGLE/MULTIは、単一選択/複数選択可能かどうかを指定するもの。
ContentProviderはツリーの(階層)データを提供するクラス。
LabelProviderはノード(要素)にラベルを付けたい場合に指定する。
setInput()でデータそのものを渡す。
これがContentProviderやLabelProviderに渡されるので、それに応じた処理を記述する。
TreeViewerでは、表示されている各ノード(要素)の左側の(開閉を示す)アイコンをクリックすることでツリーが開いたり閉じたりする。
が、デフォルトでは、ノードの文字列をダブルクリックしてもそういった動作は起こらない。
そこで、文字列をダブルクリックした場合にツリーを開閉するコードを書いてみた。
import java.util.List; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.IStructuredSelection;
TreeViewer viewer = new TreeViewer(parent, style);
viewer.addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
if (selection.isEmpty()) {
return;
}
List<?> list = selection.toList();
TreeViewer viewer = (TreeViewer) event.getSource();
for (Object element : list) {
if (viewer.getExpandedState(element)) {
viewer.collapseToLevel(element, 1);
} else {
viewer.expandToLevel(element, 1);
}
}
}
});
getExpandedState()で該当ノードが開かれているかどうかを判定し、開く場合はexpand、閉じる場合はcollapseを呼び出す。
(ちなみに、全体を開閉するexpandAll/collapseAllというメソッドもある)
もしくは、以下の様に書くことも出来る。
for (Object element : list) {
boolean expanded = viewer.getExpandedState(element);
viewer.setExpandedState(element, !expanded);
}
プログラム内からツリーの要素を選択する方法。[2013-02-10]
import org.eclipse.jface.viewers.StructuredSelection;
TreeViewer viewer = getTreeViewer(); StructuredSelection selection = new StructuredSelection(element); viewer.setSelection(selection, true);