首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

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){

                            ……和上一节示例相同

                   }

         }

}

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论