15.6 表 格 型 树
过去,表格型树是用TableTreeViewer来实现,自从SWT下的TableTree被废弃之后,其扩展TableTreeViewer也成了鸡肋,不再被建议使用。既然Tree可以实现表格型树,那么其扩展TreeViewer当然也没问题。用TreeViewer实现的表格型树,15.5节TreeViewer实例的菜单等功能代码不用做任何修改。本节实例效果如图15.6所示。

图15.6 TreeViewer实现的表格型树
还是基于15.5节实现代码修改。修改得不多,一是在主程序为树加上几个列对象TreeColumn,二是创建一个新的用于表格型树的标签器。关于TreeColumn,在讲Tree组件一节时就已提到过,在这里的使用也和以前一样,主程序的代码如下所示:
//-----------完整代码见文件:TreeViewer3.java---------------
……
TreeViewer tv = new TreeViewer(shell, SWT.BORDER);
Tree tree = tv.getTree();
tree.setHeaderVisible(true);
TreeColumn column = new TreeColumn(tree, SWT.LEFT);
column.setText("名称");
column.setWidth(150);
column = new TreeColumn(tree, SWT.LEFT);
column.setText("子结点数");
column.setWidth(80);
column = new TreeColumn(tree, SWT.LEFT);
column.setText("性别");
column.setWidth(40);
tv.setContentProvider(new TreeViewerContentProvider());
tv.setLabelProvider(new MyTableLableProvider());
……
标签器换了一个,它必须实现ITableLabelProvider接口,其代码如下:
public class MyTableLableProvider implements ITableLabelProvider {
public String getColumnText(Object element, int columnIndex) {
ITreeEntry entry = (ITreeEntry) element;
switch (columnIndex) { //根据列号,来决定显示记录的哪个字段值
case 0:
return entry.getName();
case 1:
List list = entry.getChildren();
if (list == null)
return "";
return String.valueOf(list.size());
case 2:
if (entry instanceof PeopleEntity) {
boolean sex = ((PeopleEntity) entry).isSex();
return sex ? "男" : "女";
}
return "";
default:
return "";
}
}
//-----------------------以下方法暂时不用,空实现---------------------------
public Image getColumnImage(Object element, int columnIndex) { return null; }
public void addListener(ILabelProviderListener listener) {}
public void removeListener(ILabelProviderListener listener) {}
public void dispose() {}
public boolean isLabelProperty(Object element, String property) { return false; }
}






