JAVA.SWT/JFace: SWT高級控件之樹 – JAVA編程語言程序開發技術文章

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”

發佈留言