表格型樹是用TableTreeViewer來實現,自從SWT下的TableTree被廢棄之后,其擴展TableTreeViewer也成了雞肋,不再被建議使用,既然Tree可以實現表格型樹,那么其擴展TreeView當然也沒有問題,用TreeViewer實現的表格型樹,之前的TreeViewer實例菜單的呢過功能代碼不用做任何修改.
修改的不多,一是在主程序為樹加上幾列對象TreeColumn,二是創建一個新的表格型樹的標簽器,關於TreeColumn在Tree組件的時候有此內容的講解.這個地方和之前一樣.
TreeViewer3.java
1 public class TreeViewer3 { 2 public static void main(String[] args) { 3 new TreeViewer3().open(); 4 } 5 6 public void open() { 7 final Display display = new Display(); 8 final Shell shell = new Shell(); 9 shell.setSize(300, 300); 10 // -----------界面核心代碼------------------- 11 shell.setLayout(new FillLayout()); 12 TreeViewer tv = new TreeViewer(shell, SWT.BORDER); 13 14 Tree tree = tv.getTree(); 15 tree.setHeaderVisible(true); 16 TreeColumn column = new TreeColumn(tree, SWT.LEFT); 17 column.setText("名稱"); 18 column.setWidth(150); 19 column = new TreeColumn(tree, SWT.LEFT); 20 column.setText("子結點數"); 21 column.setWidth(80); 22 column = new TreeColumn(tree, SWT.LEFT); 23 column.setText("性別"); 24 column.setWidth(40); 25 26 tv.setContentProvider(new TreeViewerContentProvider()); 27 tv.setLabelProvider(new MyTableLableProvider()); 28 // 和TableViewer一樣,數據的入口也是setInput方法 29 List<Country> input = (List)DataFactory.createTreeData(); 30 tv.setInput(input); 31 // --------------插入代碼:START------------------ 32 MyActionGroup actionGroup = new MyActionGroup(tv);// 生成一個ActionGroup對象 33 actionGroup.fillContextMenu(new MenuManager());// 將按鈕注入到菜單對象中 34 // -----------END------------------ 35 shell.open(); 36 while (!shell.isDisposed()) { 37 if (!display.readAndDispatch()) 38 display.sleep(); 39 } 40 display.dispose(); 41 } 42 }
標簽器換了一個,它必須實現ITableLabelProvider接口.
1 public class MyTableLableProvider implements ITableLabelProvider { 2 public String getColumnText(Object element, int columnIndex) { 3 ITreeEntry entry = (ITreeEntry) element; 4 switch (columnIndex) { 5 case 0: 6 return entry.getName(); 7 case 1: 8 List list = entry.getChildren(); 9 if (list == null) 10 return ""; 11 return String.valueOf(list.size()); 12 case 2: 13 if (entry instanceof People) { 14 boolean sex = ((People) entry).isSex(); 15 return sex ? "男" : "女"; 16 } 17 return ""; 18 default: 19 return ""; 20 } 21 } 22 23 public Image getColumnImage(Object element, int columnIndex) { 24 return null; 25 } 26 public void addListener(ILabelProviderListener listener) {} 27 public void removeListener(ILabelProviderListener listener) {} 28 public void dispose() {} 29 public boolean isLabelProperty(Object element, String property) { 30 return false; 31 } 32 }