`
caibinghong
  • 浏览: 149854 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

TreeViewer如何在不同类型的节点上显示不同的右键菜单?

阅读更多

这两天我刚好也遇到这样的问题,今天想到一种办法解决了,具体的做法是这样的 

首先,对不同类型的右键菜单用不同的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

分享到:
评论

相关推荐

    Eclipse开发经典教程-TreeViewer组件

    如果该节点有子节点,`TreeViewer`将在节点旁边显示一个展开/折叠图标。 3. **getChildren(Object parentElement)** 当用户展开一个节点时,`TreeViewer`将调用此方法以获取该节点的所有子节点。 4. **getParent...

    SWT TreeViewer实例

    - 实现ILabelProvider接口,决定节点在树中如何显示。这包括文本和图像。 ```java class MyLabelProvider extends ColumnLabelProvider { @Override public String getText(Object element) {...} // 可以添加...

    Treeviewer1.0

    在决策树的可视化中,Matplotlib被用来绘制树状结构,显示每个节点的决策依据、分支条件以及预测结果。通过这种方式,用户可以清晰地看到模型如何根据输入特征进行决策。 微软的决策树模型通常以XML格式存储,这是...

    自定义TreeView,在树节点旁添加按钮。

    在Windows Forms应用开发中,`TreeView`控件通常用于展示层次结构的数据,它以树状结构显示信息。在某些情况下,我们可能需要增加更多的交互功能,例如在每个节点旁边添加按钮,以提供额外的操作选项。本篇文章将...

    QT 树形图带右键 鼠标点击过滤

    在树形图上显示菜单,需要重载`contextMenuEvent`方法: ```cpp void TreeViewer::contextMenuEvent(QContextMenuEvent *event) { QMenu menu(this); QAction *filterAction = menu.addAction("Filter"); // ...

    swt Tree 例子项目代码

    当`TreeViewer`需要显示节点时,它会询问`LabelProvider`。你可以自定义`LabelProvider`,根据数据模型的实际情况返回节点的显示内容。 在实际应用中,`TreeViewer`通常与`ContentProvider`一起使用。`...

    XML TreeViewer

    1. **可视化展示**:它将XML文档转换为树状视图,每个元素作为一个节点,子元素作为子节点,属性以键值对的形式显示在节点旁边。这种可视化表示让开发者可以快速浏览整个文档结构。 2. **搜索功能**:用户可以通过...

    jface treeView 的sample

    `IStructuredContentProvider`负责提供树中的数据,而`LabelProvider`则用于为节点提供显示文本。例如: ```java viewer.setContentProvider(new ArrayContentProvider()); viewer.setLabelProvider(new ...

    hypersnap

    从压缩包中的文件名“给JFace TreeViewer树加上右键菜单,及实现菜单相应功能_三的世界_百度空间.htm”来看,这应该是一篇详细的教程,讲解了如何为JFace TreeViewer添加上下文(右键)菜单,并实现菜单项的点击事件...

    treeviewer

    是一款针对后缀名为.tre .tree .nwk 等树文件的打开及编辑软件

    SWT控件2

    4. **添加事件监听器**:可以添加各种类型的监听器,如`SelectionListener`来处理用户的点击事件,或`ExpansionListener`来响应节点展开和折叠。 5. **刷新和更新**:使用`refresh()`和`update()`方法来动态更新树...

    rcp treeview的相关资料

    创建TreeViewer需要在相应的控制台上进行。首先,你需要创建一个Composite,这是一个基本的容器,可以添加其他控件。然后,通过调用`new TreeViewer(composite)`来实例化TreeViewer对象。接下来,你可以设置...

    eclipse从入门到精通的treexiew代码

    2. **初始化TreeViewer**:在Eclipse插件的初始化阶段,您需要创建一个`TreeViewer`实例,并将其附加到已存在的`Tree`控件上。这通常在`createPartControl`方法中完成。 ```java TreeViewer viewer = new ...

    bootstrap-treeview实现多级树形菜单 后台JSON格式如何组织?

    在成功回调中,我们初始化树形菜单,并将获取到的数据赋值给treeviewer组件的data选项,同时可以设置树节点的默认展开级别(levels),是否显示标签(showTags)以及节点被选中时的回调函数(onNodeSelected)。在...

    RCP资料 filterTreeViewer

    这篇博文(尽管描述中提到的是NULL,但实际上提供了博文链接)可能详细介绍了如何创建和定制一个具有过滤能力的TreeViewer,这是一个在Eclipse RCP中用于展示数据树结构的组件。 TreeViewer在Eclipse RCP中广泛用于...

    CheckboxTreeViewer

    而CheckboxTreeViewer则是TreeViewer的一个扩展,它在每个树节点上添加了复选框,使得用户可以选择一个或多个节点。 【标签】中的“java插件”可能意味着CheckboxTreeViewer常用于Java开发环境中的插件开发,例如...

    java树形导航的实现

    在给定的代码中,我们看到的是一个Eclipse插件开发的示例,具体涉及到如何在Eclipse的工作台环境中创建和管理树形视图(TreeViewer)的菜单和工具栏操作。下面我们将详细探讨这个话题。 首先,树形导航的实现通常...

    eclipse 集成 JSON2XML Tree Viewer

    在IT行业中,开发人员经常需要处理不同的数据格式,如JSON(JavaScript Object Notation)和XML(eXtensible Markup Language)。这两种格式都有其独特的优点和应用场景,但有时我们需要在它们之间进行转换,以便于...

    DataGrid Treeview Drag and drop

    在DragDrop事件中,接收并处理拖来的数据,例如插入或更新TreeViewer中的节点。 4. **数据格式化**: - 数据在拖放过程中需要进行序列化和反序列化。可以使用.NET的Serialization机制,或者自定义数据格式(如字符...

Global site tag (gtag.js) - Google Analytics