`

给树加上右键菜单,及实现菜单相应功能

 
阅读更多

15.4  给树加上右键菜单,及实现菜单相应功能

本节实例的效果如图15.5所示。给TreeViewer加右键菜单的方法和TableViewer相似,也要用到Action、ActionGroup、MenuManager类,当然程序要根据树的特点稍做改动。

图15.5  右键菜单效果图

(1)在15.3节主程序的tv.setInput(input)之后插入如下两句:

//--------------完整代码见文件:TreeViewer2.java--------------

MyActionGroup actionGroup = new MyActionGroup(tv);// 生成一个ActionGroup对象

actionGroup.fillContextMenu(new MenuManager());// 将按钮注入到菜单对象中

(2)创建MyActionGroup类,其代码如下所示。MyActionGroup内含各Action类,在实现Action时,对传入的结点对象要记得进行空值判断,因为TreeViewer的大部分方法都不支持空值参数,会导致异常并中断程序。

public class MyActionGroup extends ActionGroup {

         private TreeViewer tv;

         public MyActionGroup(TreeViewer treeViewer) {

                   this.tv = treeViewer;

         }

         // 生成菜单Menu,并将两个Action传入

         public void fillContextMenu(IMenuManager mgr) {

                   // 加入两个Action对象到菜单管理器

                   MenuManager menuManager = (MenuManager) mgr; // 类型转换

                   menuManager.add(new OpenAction());

                   menuManager.add(new RefreshAction());

                   menuManager.add(new ExpandAction());

                   menuManager.add(new CollapseAction());

                   menuManager.add(new AddEntryAction());

                   menuManager.add(new RemoveEntryAction());

                   menuManager.add(new ModifyEntryAction());

                   // 生成Menu并挂在树Tree上

                   Tree tree = tv.getTree();

                   Menu menu = menuManager.createContextMenu(tree);

                   tree.setMenu(menu);

         }

         // “打开”的Action类

         private class OpenAction extends Action {

                   public OpenAction() {

                            setText("打开");

                   }

                   public void run() {

                            ITreeEntry entry = getSelTreeEntry();

                            if (entry != null)

                                     MessageDialog.openInformation(null, null, entry.getName());

                   }

         }

         // 刷新的Action类

         private class RefreshAction extends Action {

                   public RefreshAction() {

                            setText("刷新");

                   }

                   // 如果在删除结点时,不同时从数据模型里删除结点。则执行本刷新后,该结点又会从

                   // 数据模型中取出并显示在界面上

                   public void run() {

                            tv.refresh();

                   }

         }

         // 展开当前结点的Action类

         private class ExpandAction extends Action {

                   public ExpandAction() {

                            setText("展开");

                   }

                   public void run() {

                            ITreeEntry entry = getSelTreeEntry();

                            if (entry != null)

                                     tv.expandToLevel(entry, 1); // 参数2是展开的层数

                   }

         }

         // 收缩当前结点的Action类

         private class CollapseAction extends Action {

                   public CollapseAction() {

                            setText("收缩");

                   }

                   public void run() {

                            ITreeEntry entry = getSelTreeEntry();

                            if (entry != null)

                                     tv.collapseToLevel(entry, -1); // 参数2是收缩的层数,-1指收缩所有子结点

                   }

         }

         // 给当前结点增加一个子结点的Action类

         private class AddEntryAction extends Action {

                   public AddEntryAction() {

                            setText("增加");

                   }

                   public void run() {

                            ITreeEntry entry = getSelTreeEntry();

                            if (entry == null || entry instanceof PeopleEntity)

                                     return;// 不能给“人”结点增加子结点

                            InputDialog dialog = new InputDialog(null, "增加子结点", "输入名称:", "a", null);

                            if (dialog.open() == InputDialog.OK) {// 如果单击OK按钮

                                     String entryName = dialog.getValue(); // 得到Dialog输入值

                                     // 根据单击结点的不同类型生成相应的子结点

                                     ITreeEntry newEntry = null;

                                     if (entry instanceof CountryEntity)

                                               newEntry = new CityEntity(entryName);

                                     else if (entry instanceof CityEntity)

                                               newEntry = new PeopleEntity(entryName);

                                     entry.getChildren().add(newEntry); // 新结点增加到数据模型中

                                     tv.add(entry, newEntry);// newEntry结点增加到entry之下,或用tv.refresh(entry,true)也行

                                     if (!tv.getExpandedState(entry)) // 如果entry是未展开结点则展开它

                                               tv.expandToLevel(entry, 1);

                            }

                   }

         }

         // 删除结点的Action类

         private class RemoveEntryAction extends Action {

                   public RemoveEntryAction() {

                            setText("删除");

                   }

                   public void run() {

                            ITreeEntry entry = getSelTreeEntry();

                            if (entry == null)

                                     return;

                            // 从数据模型里删除结点

                            List<ITreeEntry> list = (List<ITreeEntry>) tv.getInput();

                            remove(list, entry);

                            // 从界面删除结点,放在从模型删除之后,

                            //否则在删除某个结点的最后一个子结点时会出问题

                            tv.remove(entry);

                   }

                   private void remove(List<ITreeEntry> list, ITreeEntry entry) {

                            if (list == null)    return;

                            for (Iterator it = list.iterator(); it.hasNext();) {

                                     ITreeEntry o = (ITreeEntry) it.next();

                                     if (o.getName().equals(entry.getName())) {

                                               it.remove();

                                               return;

                                     } else {

                                               remove(o.getChildren(), entry);

                                     }

                            }

                   }

         }

         // 修改结点名称的Action类

         private class ModifyEntryAction extends Action {

                   public ModifyEntryAction() {

                            setText("修改");

                   }

                   public void run() {

                            ITreeEntry entry = getSelTreeEntry();

                            if (entry == null)         return;

                            InputDialog dialog = new InputDialog(null, "修改结点", "输入新名称", entry.getName(), null);

                            if (dialog.open() == InputDialog.OK) {

                                     String entryName = dialog.getValue();

                                     entry.setName(entryName);//修改数据模型

                                     tv.refresh(entry); // 刷新结点,等效于tv.update(entry,null);

                            }

                   }

         }

         // 为共用而自定义的方法:取得当前选择的结点

         private ITreeEntry getSelTreeEntry() {

                   IStructuredSelection selection = (IStructuredSelection) tv.getSelection();

                   return (ITreeEntry) (selection.getFirstElement());

         }

}

<!-- page -->
分享到:
评论

相关推荐

    DhtmlxTree-dhtmlxmenu实现在节点上右键弹出菜单

    为dhtmlXTree树上的每一个节点添加右键菜单。附:在树上的节点上点右键时才会生成菜单,空白区域单击时不会生成菜单。 分析: 1、用 dhtmlXTree + dhtmlxmenu 实现。 2、 用dhtmlxmenu生成菜单的部分代码: ...

    jQuery LigerUI V1.1.0

    [增加]ligerTab增加右键菜单功能,包括 关闭其他/关闭全部等。 [增加]ligerTab增加获取Items Count,删除项等常见方法 [增加]ligerLayout增加初始化控制左边/右边隐藏、是否折叠、是否调整大小等方法。 ...

    对鼠标右键进行添加删除快捷键

    此操作同时会将“新建”菜单的文件列表中的相应项目删除。 ----2.如果您自行卸载软件后,该文件类型的菜单选项仍然存在,请进入资源管理器选择“查看”*“文件夹选项”,单击“文件类型”选项卡,选取您不再使用的...

    爱酷摄像头视频监控 V1.7.zip

    5、每个监控窗口具有右键菜单功能,方便操作。 6、任意调整摄像头的布局。 7、其他功能:支持老板键、可以锁住电脑、定时关机... 更多功能不再赘述,还是请亲自使用吧。同时欢迎对本软件提出宝贵意见,最后感谢您对...

    EasyWebSvr

    点右键菜单--“浏览主页”,就可以在浏览器中看到效果了 (作为演示,可以把主目录设置为本目录下的demo子目录) 2. 如果要执行CGI/ISAPI或PHP等脚本,注意要设置相应权限,并设置相应的脚本映射 3. 如何设置以...

    爱酷视频监控 v2.1.zip

     5、每个监控窗口具有右键菜单功能,方便操作。  6、其他功能:支持老板键、可以锁住电脑、定时关机。  2011-12-04 更新:V2.0:  1、解决老式摄像头不能正常工作。  2、新增屏幕录像。将屏幕模拟成一个...

    针式PinPKM-V201506(免费无使用限制)

    增加一个知识点可以链接多个文件,且文件类型不受限制 和相应的右键菜单 批量导入:增加全部格式和指定格式的文件类型支持,及允许指定默认的分类 增加数据库的选项卡快速选择(分类树左侧) 知识点:增加关闭时,...

    PinPKM-V201525(官网发布的最后一个免费无使用限制版本)

    增加一个知识点可以链接多个文件,且文件类型不受限制 和相应的右键菜单 批量导入:增加全部格式和指定格式的文件类型支持,及允许指定默认的分类 增加数据库的选项卡快速选择(分类树左侧) 知识点:增加关闭时,...

    小黄豆客户关系管理系统CRM v1.17.2.1116源码 XHDPowersManageThi117.rar

    29、【修复】右键菜单图标问题。 30、【修复】联系人多次加载问题。 【v1.17.1.1030】更新项 1、【修复】收款不能修改。 2、【修复】修改员工会清除密码。 【v1.17.2.1116】更新项 1、【修复】部分服务器...

    网际畅游 MyIE 3.0 源代码

    他会为你加上http://www.及相应的后缀如:.com, .net, .com.cn。你可以在MyIE选项中修改它们。 一次打开窗口的最大值:在 MyIE选项中可设置这个值, 他规定了在批量打开窗口时, 每次的最大值。可根据你的习惯和...

    WimTool-1.09.10.01

    12.支持WIM映像文件与WimTool程序直接关联,并可创建右键菜单,方便挂载或打开WIM映像文件。 13.支持列出映像内的文件目录,这个功能相当于ImageX的/DIR参数,可以在PE系统中使用。 14.支持通过配置文件定义捕获映像...

    飞秋2013专业版

    - 给所有在线的用户群发消息及分组群发功能 - 黑名单功能 - 隐身功能,及对某特定组进行隐身功能 - 自定义备注名功能 - 个性头像、个性形象及个性签名功能 - 共享文件功能 - 远程协助功能 - 语音聊天功能 - 自定义...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    标右键,在弹出的菜单中选择go to slot。 9.我们选择单击事件clicked()。 10.我们在弹出的槽函数中添加一句: my2.show(); my2 为我们新建对话框类的另一个对象,但是my2 我们还没有定义,所以 在widget.h 文件中...

    javapms门户网站源码

    点击“文档中心”左侧功能菜单的“栏目管理”,栏目管理也是采用直观、方便的树形组织形式进行网站栏目管理,层次鲜明,和前台页面栏目一一对应,栏目树如下图所示: 点击某个栏目,右侧会显示该栏目下的所以子...

    Wsyscheck.exe

    修复隐藏文件显示及禁用硬盘自动播放:菜单栏太长写不完,本功能还包括磁盘无法双击打开故障。注意,某些故障修复后可能需要注销或重启才能生效。 修复安全模式:某些木马会破坏安全模式的键值导致无法进入安全模式...

    单片机课程设计报告—简易计算器1.doc.doc

    4)把源文件添加到项目中,用鼠标指在目标工作区的目标1,点击右键在弹出的菜单 中选择添加文件到源代码组,在弹出的添加文件框中,选择需要添加到项目中的文件。 5)开始编译,对项目文件进行编译。若没有错误后...

    网管教程 从入门到精通软件篇.txt

    Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的诊断和测试以及恢复系统功能的工具。小编的确一直都想把这方面的命令做个总结,这次辛苦老范给我们整理了这份实用的秘笈。 ...

    计算机应用基础经典题目解析.doc

    直接在页眉和页脚编辑区输入内容,结束后在正文 区双击鼠标或单击"页眉和页脚"工具栏的"关闭"按钮,关闭页眉和页脚及"页眉和页脚" 工具栏,即实现了页眉页脚的设置。 设置页码:选择菜单中的"插入" "页码"命令,在弹...

    立方酒店管理系统(SQL三层)

    可以在房态盘中操作,也可以在主菜单中操作,也可以在右键菜单中操作; 可以单独结帐,也可以多个客房合并结帐; 多达8种的结帐方式,包含人民币、信用卡、支票、记帐、挂散客、挂团队、未结帐、贵宾卡结帐; ...

Global site tag (gtag.js) - Google Analytics