JAVA.SWT/JFace: SWT高级控件之树(Tree)

 

  
  
  
  
  1. package com.wjc.tree;  
  2.  
  3. import org.eclipse.swt.SWT;  
  4. import org.eclipse.swt.custom.TreeEditor;  
  5. import org.eclipse.swt.events.ModifyEvent;  
  6. import org.eclipse.swt.events.ModifyListener;  
  7. import org.eclipse.swt.events.SelectionAdapter;  
  8. import org.eclipse.swt.events.SelectionEvent;  
  9. import org.eclipse.swt.events.TreeEvent;  
  10. import org.eclipse.swt.events.TreeListener;  
  11. import org.eclipse.swt.layout.FillLayout;  
  12. import org.eclipse.swt.widgets.Control;  
  13. import org.eclipse.swt.widgets.Display;  
  14. import org.eclipse.swt.widgets.Shell;  
  15. import org.eclipse.swt.widgets.Text;  
  16. import org.eclipse.swt.widgets.Tree;  
  17. import org.eclipse.swt.widgets.TreeColumn;  
  18. import org.eclipse.swt.widgets.TreeItem;  
  19.  
  20. public class TreeSample {  
  21.     public static void main(String[] args) {  
  22.  
  23.         final Display display = new Display();  
  24.         final Shell shell = new Shell(display);  
  25.         shell.setText("Tree Sample");  
  26.         shell.setLayout(new FillLayout());  
  27.         // 创建一个树对象  
  28.         final Tree tree = new Tree(shell, SWT.BORDER | SWT.SINGLE);  
  29.         // 创建树的一个根节点  
  30.         TreeItem root = new TreeItem(tree, SWT.NULL);  
  31.         root.setText("根节点");  
  32.         // 创建子孙节点  
  33.         TreeItem child1 = new TreeItem(root, SWT.NULL);  
  34.         child1.setText("子孙1");  
  35.         TreeItem child2 = new TreeItem(root, SWT.NULL);  
  36.         child2.setText("子孙2");  
  37.         TreeItem child3 = new TreeItem(root, SWT.NULL);  
  38.         child3.setText("子孙3");  
  39.  
  40.         TreeItem child11 = new TreeItem(child1, SWT.NULL);  
  41.         child11.setText("子孙11");  
  42.         TreeItem child12 = new TreeItem(child1, SWT.NULL);  
  43.         child12.setText("子孙12");  
  44.  
  45.         TreeItem child111 = new TreeItem(child11, SWT.NULL);  
  46.         child111.setText("子孙111");  
  47.         TreeItem child112 = new TreeItem(child11, SWT.NULL);  
  48.         child112.setText("子孙112");  
  49.         // 调用convertImage方法来设置树的图标  
  50.         convertImage(tree);  
  51.         // 为树注册树监听事件  
  52.         tree.addTreeListener(new TreeListener() {  
  53.             // 当折叠树节点时  
  54.             public void treeCollapsed(TreeEvent e) {  
  55.                 // 首先获得触发事件的TreeItem  
  56.                 TreeItem item = (TreeItem) e.item;  
  57.                 // 将该节点的图标设置为关闭状态  
  58.                 // item.setImage(ImageFactory.loadImage(tree.getDisplay(),  
  59.                 // ImageFactory.TOC_CLOSED));  
  60.             }  
  61.  
  62.             // 当展开树节点时  
  63.             public void treeExpanded(TreeEvent e) {  
  64.                 TreeItem item = (TreeItem) e.item;  
  65.                 // item.setImage(ImageFactory.loadImage(tree.getDisplay(),  
  66.                 // ImageFactory.TOC_OPEN));  
  67.             }  
  68.  
  69.         });  
  70.         // /********************************************************  
  71.         // 创建一个可编辑的TreeEditor对象  
  72.         final TreeEditor editor = new TreeEditor(tree);  
  73.         editor.horizontalAlignment = SWT.LEFT;  
  74.         editor.grabHorizontal = true;  
  75.         editor.minimumWidth = 30;  
  76.         // 注册选中事件  
  77.         tree.addSelectionListener(new SelectionAdapter() {  
  78.             // 当鼠标双击节点时使节点可编辑  
  79.             public void widgetDefaultSelected(SelectionEvent e) {  
  80.                 // 释放之前编辑的控件  
  81.                 Control oldEditor = editor.getEditor();  
  82.                 if (oldEditor != null)  
  83.                     oldEditor.dispose();  
  84.                 // 获得触发事件的TreeItem,如果为null,返回  
  85.                 TreeItem item = (TreeItem) e.item;  
  86.                 if (item == null)  
  87.                     return;  
  88.                 // 创建一个文本框,作为编辑节点时输入的文字  
  89.                 Text newEditor = new Text(tree, SWT.NONE);  
  90.                 // 将树节点的值赋值给文本框  
  91.                 newEditor.setText(item.getText());  
  92.                 // 当文本框的值改变时,也相应的该把你树节点数据的值  
  93.                 newEditor.addModifyListener(new ModifyListener() {  
  94.                     public void modifyText(ModifyEvent e) {  
  95.                         Text text = (Text) editor.getEditor();  
  96.                         editor.getItem().setText(text.getText());  
  97.                     }  
  98.                 });  
  99.                 newEditor.selectAll();// 选中所有文本框  
  100.                 newEditor.setFocus();// 并将焦点设置为该文本框  
  101.                 // 将树节点与文本框节点绑定  
  102.                 editor.setEditor(newEditor, item);  
  103.             }  
  104.  
  105.         });  
  106.         // ****************************************************************/  
  107.         // /***************************************************************  
  108.         // 为树创建5列  
  109.         for (int i = 0; i < 5; i++) {  
  110.             TreeColumn column = new TreeColumn(tree, SWT.NONE);  
  111.             column.setText("column" + i);  
  112.         }  
  113.         for (int i = 0; i < tree.getColumnCount(); i++)  
  114.             tree.getColumn(i).pack();  
  115.         // 设置网格线可见  
  116.         tree.setLinesVisible(true);  
  117.         // 设置表头可见  
  118.         tree.setHeaderVisible(true);  
  119.         // ***************************************************************/  
  120.         shell.setSize(200150);  
  121.         shell.open();  
  122.         while (!shell.isDisposed()) {  
  123.             if (!display.readAndDispatch())  
  124.                 display.sleep();  
  125.         }  
  126.         // ImageFactory.dispose();  
  127.         display.dispose();  
  128.     }  
  129.  
  130.     // 设置树图标的方法  
  131.     public static void convertImage(Tree tree) {  
  132.         // 这里假设只有一个根节点  
  133.         TreeItem[] items = tree.getItems();  
  134.         // 首先根据根节点的状态设置图标  
  135.         // if (items[0].getExpanded())// 如果该节点为展开状态  
  136.         // items[0].setImage(ImageFactory.loadImage(tree.getDisplay(),  
  137.         // ImageFactory.TOC_OPEN));  
  138.         // else  
  139.         // // 否则,如果为折叠状态  
  140.         // items[0].setImage(ImageFactory.loadImage(tree.getDisplay(),  
  141.         // ImageFactory.TOC_CLOSED));  
  142.         // 设置该根节点的图标  
  143.         setChildImage(items[0]);  
  144.     }  
  145.  
  146.     // 设置一个节点的方法,该方法非常重要,要理解该方法的递归用法  
  147.     // 参数item可以把单独看作是树中的某一个TreeItem  
  148.     public static void setChildImage(TreeItem item) {  
  149.         // 首先获得该TreeItem的所有子TreeItem  
  150.         TreeItem[] items = item.getItems();  
  151.         // 循环每一个TreeItem  
  152.         for (int i = 0; i < items.length; i++) {  
  153.             // 如果这个TreeItem下没有子孙  
  154.             // if (items[i].getItems().length == 0)  
  155.             // items[i].setImage(ImageFactory.loadImage(item.getDisplay(),  
  156.             // ImageFactory.TOPIC));  
  157.             // else {// 如果这个TreeItem有多个子孙  
  158.             // // 如果这个TreeItem是展开状态,则设置展开的图片  
  159.             // if (items[i].getExpanded())  
  160.             // items[i].setImage(ImageFactory.loadImage(item.getDisplay(),  
  161.             // ImageFactory.TOC_OPEN));  
  162.             // else  
  163.             // // 否则,则设置折叠的图片  
  164.             // items[i].setImage(ImageFactory.loadImage(item.getDisplay(),  
  165.             // ImageFactory.TOC_CLOSED));  
  166.             // 要为该TreeItem得子孙设置图标,递归调用setChildImage方法  
  167.             setChildImage(items[i]);  
  168.         }  
  169.     }  
  170. }  

 

你可能感兴趣的:(tree,职场,休闲,SWT高级控件)