Eclipse 3.1裡deprecate了TableTree這個控制項,與之對應的jface的TableTreeViewer雖然沒有deprecate,但使用它會得到很多警告。在TableTreeViewer的第一列裡是不能顯示表徵圖的,因為這個位置被+/-符號佔用了,而且TableTree是顯示不出 Tree的層次的,也就是沒有縮排。
SWT 3.1裡的Tree控制項新支援了列的顯示,是通過TreeColumn來實現的。在jface裡則沒有添加新的viewer,使用原先的TreeViewer即可支援,下面是一段例子代碼,注意如果在windows裡運行要修改一下setInput()這條語句的參數,例如改為setInput(new File("c:\\"))。
import java.io.File;import org.eclipse.jface.viewers.ILabelProviderListener;import org.eclipse.jface.viewers.ITableLabelProvider;import org.eclipse.jface.viewers.ITreeContentProvider;import org.eclipse.jface.viewers.TreeViewer;import org.eclipse.jface.viewers.Viewer;import org.eclipse.swt.SWT;import org.eclipse.swt.graphics.Image;import org.eclipse.swt.layout.FillLayout;import org.eclipse.swt.widgets.Display;import org.eclipse.swt.widgets.Shell;import org.eclipse.swt.widgets.TreeColumn;public class TreeColumnTest { public void run(){ final Display display = new Display(); final Shell shell = new Shell(display); shell.setLayout(new FillLayout()); final TreeViewer viewer = new TreeViewer(shell, SWT.FULL_SELECTION); viewer.getTree().setHeaderVisible(true); TreeColumn column = new TreeColumn(viewer.getTree(), SWT.LEFT); column.setText("Name"); column.setWidth(200); column = new TreeColumn(viewer.getTree(), SWT.LEFT); column.setText("Size"); column.setWidth(100); column = new TreeColumn(viewer.getTree(), SWT.LEFT); column.setText("Hidden"); column.setWidth(100); viewer.setContentProvider(new MyTreeContenetProvider()); viewer.setLabelProvider(new MyTableLableProvider()); viewer.setInput(new File("/")); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } public static void main(String[] args) { new TreeColumnTest().run(); } class MyTreeContenetProvider implements ITreeContentProvider{ public Object[] getChildren(Object parentElement) { File file=(File)parentElement; if(file.isDirectory()) return file.listFiles(); else return null; } public Object getParent(Object element) { File file=(File)element; return file.getParentFile(); } public boolean hasChildren(Object element) { File file=(File)element; return file.isDirectory()/*&&file.list().length>0*/; } public Object[] getElements(Object inputElement) { File file=(File)inputElement; return file.isDirectory()?file.listFiles():new Object[]{file}; } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } } class MyTableLableProvider implements ITableLabelProvider{ public Image getColumnImage(Object element, int columnIndex) { return null; } public String getColumnText(Object element, int columnIndex) { File file=(File)element; switch (columnIndex) { case 0: return file.getName(); case 1: return ""+file.length(); case 2: return ""+file.isHidden(); default: return ""; } } public void addListener(ILabelProviderListener listener) { } public void dispose() { } public boolean isLabelProperty(Object element, String property) { return false; } public void removeListener(ILabelProviderListener listener) { } }}
下面是運行畫面: