15.7 带复选框的树
树的复选框用CheckboxTreeViewer实现,由于其子类ContainerCheckedTreeViewer在没有选择全部子结点时可以自动将父结点设置成灰选,所以实现树的复选框更多是用ContainerCheckedTreeViewer。本节实例的效果如图15.7所示,具体实现步骤如下:

图15.7 带复选框的树
(1)修改主程序,用ContainerCheckedTreeViewer完全替换TreeViewer。因为
CheckboxTreeViewer、ContainerCheckedTreeViewer都是TreeViewer的子类,所以这种替换是可行的。
//-------------完整代码见文件:TreeViewer4.java----------------------------------------
shell.setLayout(new FillLayout());
//用ContainerCheckedTreeViewer完全替换TreeViewer
ContainerCheckedTreeViewer tv = new ContainerCheckedTreeViewer(shell, SWT.BORDER);
tv.setUseHashlookup(true); //加快查找速度
……
MyActionGroup2 actionGroup = new MyActionGroup2(tv);//改用另一个ActionGroup
……
(2)为了不和原来的程序干扰,重新创建一个简化了的ActionGroup。其代码如下所示:
public class MyActionGroup2 extends ActionGroup {
private ContainerCheckedTreeViewer tv;
public MyActionGroup2(ContainerCheckedTreeViewer tv) {
this.tv = tv;
}
public void fillContextMenu(IMenuManager mgr) {
MenuManager menuManager = (MenuManager) mgr;
menuManager.add(new SelectAllAction());
menuManager.add(new RemoveEntryAction());
Tree tree = tv.getTree();
Menu menu = menuManager.createContextMenu(tree);
tree.setMenu(menu);
}
private class SelectAllAction extends Action {
public SelectAllAction() {
setText("勾选当前结点的所有子结点");
}
public void run() {
IStructuredSelection selection = (IStructuredSelection) tv.getSelection();
ITreeEntry entry = (ITreeEntry) (selection.getFirstElement());
tv.setSubtreeChecked(entry, true); // false不勾选
}
}
private class RemoveEntryAction extends Action {
public RemoveEntryAction() {
setText("删除");
}
public void run() {
Object[] checks = tv.getCheckedElements(); //取得被勾选的结点(包括灰选)
if (checks.length == 0) {
MessageDialog.openInformation(null, "提示", "请先勾选记录");
return;
}
List<ITreeEntry> inputList = (List<ITreeEntry>) tv.getInput();
for (Object object : checks) {
if (tv.getGrayed(object)) continue;// 灰选结点不删除
ITreeEntry entry = (ITreeEntry) object;
remove(inputList, entry);
tv.remove(entry);
}
}
private void remove(List<ITreeEntry> list, ITreeEntry entry){
……和上一节示例相同
}
}
}






