这两天我刚好也遇到这样的问题,今天想到一种办法解决了,具体的做法是这样的
首先,对不同类型的右键菜单用不同的ActionGroup来实现,比如,有PeopleActionGroup, CityActionGroup, CountryActionGroup, 在以上每个类中,编写不同的内部类extends Action类实现不同的菜单功能
其次,在TreeViewer类中,我没有找到合适的用来响应鼠标事件的监听器,(最初尝试使用)tv.addSelectionChangedListener( new ISelectionChangedListener(){
public void selectionChanged(SelectionChangedEvent event) {});
但是效果不是太好。最后会说明是为什么。
我们知道,TreeViewer类中组合了一个SWT Tree类,而且可以通过getTree()方法得到。而且在Tree类中鼠标的监听器类,所以就尝试用这种方法来实现
具体代码如下:
//代码片断
tree = tv.getTree();
tree.addMouseListener( new MouseAdapter(){
public void mouseDown(MouseEvent e) {
if( e.button == 3 ){
//鼠标单击右键,3D鼠标
// 检查是否点到了具体的节点
TreeItem treeItem = tree.getItem( new Point( e.x, e.y ) );
//没有点到具体结点
if( treeItem != null ){
//选中了某一节点
//selection和TreeItem是一致的,交回TreeViewer进行处理
IStructuredSelection selection =
( IStructuredSelection )tv.getSelection();
ITreeEntry entry = ( ITreeEntry )selection.getFirstElement();
//对不同类型的节点关联相应的右键菜单
if( entry instanceof CountryEntity){
System.out.println( "Inner policyActionGroup " + policyActionGroup );
policyActionGroup.fillContextMenu();
}else if( entry instanceof CityEntity ){
System.out.println( "ruleActionGroup " + ruleActionGroup );
ruleActionGroup.fillContextMenu();
}
}else{
//没有节点被选中
policyActionGroup.dispose();
ruleActionGroup.dispose();
}
}else if( e.button == 1 ){
//鼠标单击,左键,对应的代码
}
}
});
这里边的PolicyActionGroup, ruleAcitonGroup都是相应的AcitonGroup对应的实例
由于在SWT中菜单都是挂在某一Control上的,所以为了使程序运行过程中尽量的少生成对象,把陈刚ActionGroup例子中的程序改动如下
public class RuleActionGroup extends ActionGroup{
private TreeViewer tv;
private MenuManager menuManager;
public RuleActionGroup( TreeViewer tv ){
this.tv = tv;
}
/*
* 生成菜单Menu,并将Aciton传入
*/
public void fillContextMenu(){
/*
* 加入两个Action对象到菜单管理器
*/
//把menuManager声明成为成员变量,不用每次都添加Action?
if( menuManager == null ){
//第一次调用该方法时
menuManager = new MenuManager();
menuManager.add( new OpenAction() );
menuManager.add( new RefreshAction() );
menuManager.add( new AddEntryAction() );
menuManager.add( new RemoveEntryAction() );
}
/*
* 生成Menu并挂在Tree上
*/
Tree tree = tv.getTree();
Menu menu = menuManager.createContextMenu( tree );
//tree.setMenu( null );
tree.setMenu( menu );
}
/*
* 打开的Action类
*/
private class OpenAction extends Action{
public OpenAction(){
setText( "打开规则 " );
}
/*
* 继承自Action的方法,动作代码在此代码中
*/
public void run(){
}
}
/*
* 刷新的Action类
*/
private class RefreshAction extends Action{
public RefreshAction(){
setText( "刷新策略 " );
}
public void run(){
}
}
/*
* 增加的Action类
*/
private class AddEntryAction extends Action{
public AddEntryAction(){
setText( "添加额外逻辑 " );
}
public void run(){
}
}
}
/*
* 删除结点的Aciton类
*/
private class RemoveEntryAction extends Action{
public RemoveEntryAction(){
setText( "删除规则 " );
}
public void run(){
}
public void dispose() {
// TODO 自动生成方法存根
super.dispose();
tv.getTree().setMenu( null );
}
}
改动如下,没有复写AcitonGroup中的public void fillContextMenu( IMenuManager mgr )方法,而是自己实现了一个同名的方法。把MenuManager作为类的实例变量,只在第一次调用fillContextMenu()生成相应的menuManager,和Aciton对象,在dispose()方法中把书中挂的菜单清空,需要的时候再挂上。
http://topic.csdn.net/u/20070605/15/ba405d40-502e-40bd-b4d8-ba34b7e61eb9.html
分享到:
相关推荐
基于C# winform,写的一个自定义TreeView和TreeNode,可以在每个自定义节点旁添加按钮。
Eclipse开发经典教程-TreeViewer组件
SWT的一个实例 TreeViewer的小程序范例
基于python3.4,pyqt5和matplotlib的微软决二叉策树查看工具,内含源码
是一款针对后缀名为.tre .tree .nwk 等树文件的打开及编辑软件
qt 树形图 treeviewer 鼠标点击过滤
XML Tree Viewer,xml 树形结构查看器,是xml有关的开发人员的必备工具
#TreeViewer 交互式进化树可视化 此 Web 服务旨在提供完全交互式的进化树查看器。 该项目仍处于重开发阶段,可能会频繁出现大规模更改。 要测试 TreeViewer 的基本版本,请单击。 依赖项包括 D3.js、Bootstrap 和 ...
发现jExplorer这个名字已经泛滥了 <br>最核心代码来自IBM的JFace教程 链接如下: http://blog.csdn.net/fanlincn/archive/2006/03/13/623672.aspx<br><br>在核心代码的基础上,我进行了很多改进,并增添了...
.2.1.4 在不同的语言中切换 15 2.2 直接获取SWT工具包 16 2.3 下载和安装Visual Editor 17 2.3.1 Visual Editor的下载 17 2.3.2 Visual Editor的安装 18 2.4 第一个SWT程序 19 2.4.1 创建SWT程序 19 ...
3. 返回上一级菜单 4. 重命名 5. 刷新 6. 删除 7. 按文件名/大小/类型/最后修改日期排序 8. 对当前文件夹进行过滤操作 9. 对当前文件夹的简要统计 尚未实现的功能: 1. 剪切/复制/粘贴 2. 拖拽 3. 弹出菜单中的排序...
eclipse 集成 JSON2XML Tree Viewer,json文本可以转换成xml和Tree
学生在学校的公共机房或者宿舍的个人电脑上通过网络来选课,只要选课还没有截止,学生能够灵活的修改自己的选课情况,大大提高了学校选课工作的效率。教务处的教师则通过选课系统的管理员子系统来管理学生的选课情况...
学生在学校的公共机房或者宿舍的个人电脑上通过网络来选课,只要选课还没有截止,学生能够灵活的修改自己的选课情况,大大提高了学校选课工作的效率。教务处的教师则通过选课系统的管理员子系统来管理学生的选课情况...
本实例完成了bootstrap TreeView的各种选择的事件触发,选中后打印出树节点的相关信息,包括单选,全选,父级和定位
支持拽入:可以将源/目标目录以及配置文件拽入相对应窗口 支持双击:在窗口双击可以打开相应功能 新TreeViewer窗口:更加清晰地显示目标目录的文件结构 窗口大小可调:每个窗口的大小都可以随意调整...
实现datagrid and treeviewer的drag drop, 只可单向drag
返回上一级菜单 4. 重命名 5. 刷新 6. 删除 7. 按文件名/大小/类型/最后修改日期排序 8. 对当前文件夹进行过滤操作 9. 对当前文件夹的简要统计 <br>尚未实现的功能: 1. 剪切/复制/粘贴...