package com.wjc.tree;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TreeEditor;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.TreeEvent;
import org.eclipse.swt.events.TreeListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
public class TreeSample {
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("Tree Sample");
shell.setLayout(new FillLayout());
// 創建一個樹對象
final Tree tree = new Tree(shell, SWT.BORDER | SWT.SINGLE);
// 創建樹的一個根節點
TreeItem root = new TreeItem(tree, SWT.NULL);
root.setText("根節點");
// 創建子孫節點
TreeItem child1 = new TreeItem(root, SWT.NULL);
child1.setText("子孫1");
TreeItem child2 = new TreeItem(root, SWT.NULL);
child2.setText("子孫2");
TreeItem child3 = new TreeItem(root, SWT.NULL);
child3.setText("子孫3");
TreeItem child11 = new TreeItem(child1, SWT.NULL);
child11.setText("子孫11");
TreeItem child12 = new TreeItem(child1, SWT.NULL);
child12.setText("子孫12");
TreeItem child111 = new TreeItem(child11, SWT.NULL);
child111.setText("子孫111");
TreeItem child112 = new TreeItem(child11, SWT.NULL);
child112.setText("子孫112");
// 調用convertImage方法來設置樹的圖標
convertImage(tree);
// 為樹註冊樹監聽事件
tree.addTreeListener(new TreeListener() {
// 當折疊樹節點時
public void treeCollapsed(TreeEvent e) {
// 首先獲得觸發事件的TreeItem
TreeItem item = (TreeItem) e.item;
// 將該節點的圖標設置為關閉狀態
// item.setImage(ImageFactory.loadImage(tree.getDisplay(),
// ImageFactory.TOC_CLOSED));
}
// 當展開樹節點時
public void treeExpanded(TreeEvent e) {
TreeItem item = (TreeItem) e.item;
// item.setImage(ImageFactory.loadImage(tree.getDisplay(),
// ImageFactory.TOC_OPEN));
}
});
// /********************************************************
// 創建一個可編輯的TreeEditor對象
final TreeEditor editor = new TreeEditor(tree);
editor.horizontalAlignment = SWT.LEFT;
editor.grabHorizontal = true;
editor.minimumWidth = 30;
// 註冊選中事件
tree.addSelectionListener(new SelectionAdapter() {
// 當鼠標雙擊節點時使節點可編輯
public void widgetDefaultSelected(SelectionEvent e) {
// 釋放之前編輯的控件
Control oldEditor = editor.getEditor();
if (oldEditor != null)
oldEditor.dispose();
// 獲得觸發事件的TreeItem,如果為null,返回
TreeItem item = (TreeItem) e.item;
if (item == null)
return;
// 創建一個文本框,作為編輯節點時輸入的文字
Text newEditor = new Text(tree, SWT.NONE);
// 將樹節點的值賦值給文本框
newEditor.setText(item.getText());
// 當文本框的值改變時,也相應的該把你樹節點數據的值
newEditor.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
Text text = (Text) editor.getEditor();
editor.getItem().setText(text.getText());
}
});
newEditor.selectAll();// 選中所有文本框
newEditor.setFocus();// 並將焦點設置為該文本框
// 將樹節點與文本框節點綁定
editor.setEditor(newEditor, item);
}
});
// ****************************************************************/
// /***************************************************************
// 為樹創建5列
for (int i = 0; i < 5; i++) {
TreeColumn column = new TreeColumn(tree, SWT.NONE);
column.setText("column" + i);
}
for (int i = 0; i < tree.getColumnCount(); i++)
tree.getColumn(i).pack();
// 設置網格線可見
tree.setLinesVisible(true);
// 設置表頭可見
tree.setHeaderVisible(true);
// ***************************************************************/
shell.setSize(200, 150);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
// ImageFactory.dispose();
display.dispose();
}
// 設置樹圖標的方法
public static void convertImage(Tree tree) {
// 這裡假設隻有一個根節點
TreeItem[] items = tree.getItems();
// 首先根據根節點的狀態設置圖標
// if (items[0].getExpanded())// 如果該節點為展開狀態
// items[0].setImage(ImageFactory.loadImage(tree.getDisplay(),
// ImageFactory.TOC_OPEN));
// else
// // 否則,如果為折疊狀態
// items[0].setImage(ImageFactory.loadImage(tree.getDisplay(),
// ImageFactory.TOC_CLOSED));
// 設置該根節點的圖標
setChildImage(items[0]);
}
// 設置一個節點的方法,該方法非常重要,要理解該方法的遞歸用法
// 參數item可以把單獨看作是樹中的某一個TreeItem
public static void setChildImage(TreeItem item) {
// 首先獲得該TreeItem的所有子TreeItem
TreeItem[] items = item.getItems();
// 循環每一個TreeItem
for (int i = 0; i < items.length; i++) {
// 如果這個TreeItem下沒有子孫
// if (items[i].getItems().length == 0)
// items[i].setImage(ImageFactory.loadImage(item.getDisplay(),
// ImageFactory.TOPIC));
// else {// 如果這個TreeItem有多個子孫
// // 如果這個TreeItem是展開狀態,則設置展開的圖片
// if (items[i].getExpanded())
// items[i].setImage(ImageFactory.loadImage(item.getDisplay(),
// ImageFactory.TOC_OPEN));
// else
// // 否則,則設置折疊的圖片
// items[i].setImage(ImageFactory.loadImage(item.getDisplay(),
// ImageFactory.TOC_CLOSED));
// 要為該TreeItem得子孫設置圖標,遞歸調用setChildImage方法
setChildImage(items[i]);
}
}
}
作者“TinyKing”