通过TreeColumn实现“表格树”TableTree
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) { } } }
下面是运行画面: