【Java】JFaceのTreeViewerを利用するサンプル【SWT】
はじめに
JFaceのTreeViewerというクラスを利用すると大変簡単にツリーコンポーネントを操作できます。
用意するクラス
以下の3つのファイルを用意します。
TreeViewerTest.java・・・テスト起動クラス
MyTreeContentProvider.java・・・TreeContentProviderの実装(ツリーの内部データを管理)
MyTreeLabelProvider.java・・・LabelProviderの実装(ツリーの表示を管理)
サンプル
TreeViewerTest.java
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
/**
* JFaceのTreeViewerを利用したツリーコンポーネント操作のテストアプリ
*/
public class TreeViewerTest extends ApplicationWindow {
/**
* コンストラクタ
*
*/
public TreeViewerTest() {
super(null);
}
/**
* メイン
*
* @param args
*/
public static void main(String[] args) {
TreeViewerTest window = new TreeViewerTest(); // トップレベル・シェルの作成
window.setBlockOnOpen(true); // ウィンドウが閉じられるまでopen()メソッドをブロック
window.open(); // 表示
Display.getCurrent().dispose(); // Displayの破棄
}
@Override
protected void configureShell(Shell shell) {
super.configureShell(shell);
// Set the title bar text and the size
shell.setText("TreeViewerTest.");
shell.setSize(200, 300);
}
@Override
protected Control createContents(Composite parent) {
// 親コンポジットのレイアウト設定
parent.setLayout(new GridLayout(1, false));
/***********************************************************************
* TreeViewerの設定
**********************************************************************/
// TreeViewerを生成
TreeViewer treeViewer = new TreeViewer(parent);
// TreeViewerにContentProviderの実装をセット
treeViewer.setContentProvider(new MyTreeContentProvider());
// TreeViewerにLabelProviderの実装をセット
treeViewer.setLabelProvider(new MyTreeLabelProvider());
// TreeViewerにツリー構造のトップとなるオブジェクトをsetInputする。ここでは適当な文字列を入れています。
treeViewer.setInput("root");
/***********************************************************************
* Treeの設定
**********************************************************************/
// Treeを生成
Tree tree = treeViewer.getTree();
// Treeにレイアウトデータをセット
GridData treeGridData = new GridData(GridData.FILL_BOTH);
tree.setLayoutData(treeGridData);
// TreeにSelectionListenerをセット
tree.addSelectionListener(new SelectionListener(){
public void widgetDefaultSelected(SelectionEvent e) {
TreeItem item = (TreeItem) e.item;
System.out.println("widgetDefaultSelected: " + item.getText());
}
/**
* クリックされたらここを通ります。
*/
public void widgetSelected(SelectionEvent e) {
TreeItem item = (TreeItem) e.item;
System.out.println("widgetSelected: " + item.getText());
}
});
return parent;
}
}
MyTreeContentProvider.java
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
/**
* TreeContentProviderの実装
*/
public class MyTreeContentProvider implements ITreeContentProvider {
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
*/
public Object[] getChildren(Object arg0) {
// ダミーの子要素を返します。
return new String[] { "child1", "child2", "child3" };
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
*/
public Object getParent(Object arg0) {
return null;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
*/
public boolean hasChildren(Object arg0) {
// 親ノードならtrueを返し、それでなければfalseを返します。
if (arg0.toString().equals("element1")
|| arg0.toString().equals("element2")) {
return true;
} else {
return false;
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
public Object[] getElements(Object arg0) {
// ダミーの親要素を返します。
return new String[] { "element1", "element2" };
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
public void dispose() {
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
* java.lang.Object, java.lang.Object)
*/
public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
}
}
MyTreeLabelProvider.java
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
/**
* LabelProviderの実装
*/
public class MyTreeLabelProvider extends LabelProvider implements
ILabelProvider {
/**
* 表示ラベル設定
*/
@Override
public String getText(Object obj) {
// 与えられたオブジェクトを文字列で表示
return obj.toString();
}
/**
* アイコン設定
*/
@Override
public Image getImage(Object element) {
URL urlStr = null;
try {
// クラスパスにimage.gifというアイコン画像 があるものと仮定
urlStr = ClassLoader.getSystemResource("image.gif");
} catch (Exception e) {
e.printStackTrace();
}
return ImageDescriptor.createFromURL(urlStr).createImage();
}
});
}
結果
上記のサンプルでは以下のようなノードが生成されます。
- element1
- child1
- child2
- child3
- element2
- child1
- child2
- child3
ポイント
TreeViewerTest.javaの「TreeViewerの設定」部分がポイントです。
//? TreeViewerを生成
TreeViewer treeViewer = new TreeViewer(parent);
//? TreeViewerにContentProviderの実装をセット
treeViewer.setContentProvider(new MyTreeContentProvider());
//? TreeViewerにLabelProviderの実装をセット
treeViewer.setLabelProvider(new MyTreeLabelProvider());
//? TreeViewerにInputをセット。ここにツリー構造のトップとなるオブジェクトを渡します。
treeViewer.setInput("root");