这两天我刚好也遇到这样的问题,今天想到一种办法解决了,具体的做法是这样的
首先,对不同类型的右键菜单用不同的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
分享到:
相关推荐
如果该节点有子节点,`TreeViewer`将在节点旁边显示一个展开/折叠图标。 3. **getChildren(Object parentElement)** 当用户展开一个节点时,`TreeViewer`将调用此方法以获取该节点的所有子节点。 4. **getParent...
- 实现ILabelProvider接口,决定节点在树中如何显示。这包括文本和图像。 ```java class MyLabelProvider extends ColumnLabelProvider { @Override public String getText(Object element) {...} // 可以添加...
在决策树的可视化中,Matplotlib被用来绘制树状结构,显示每个节点的决策依据、分支条件以及预测结果。通过这种方式,用户可以清晰地看到模型如何根据输入特征进行决策。 微软的决策树模型通常以XML格式存储,这是...
在Windows Forms应用开发中,`TreeView`控件通常用于展示层次结构的数据,它以树状结构显示信息。在某些情况下,我们可能需要增加更多的交互功能,例如在每个节点旁边添加按钮,以提供额外的操作选项。本篇文章将...
在树形图上显示菜单,需要重载`contextMenuEvent`方法: ```cpp void TreeViewer::contextMenuEvent(QContextMenuEvent *event) { QMenu menu(this); QAction *filterAction = menu.addAction("Filter"); // ...
当`TreeViewer`需要显示节点时,它会询问`LabelProvider`。你可以自定义`LabelProvider`,根据数据模型的实际情况返回节点的显示内容。 在实际应用中,`TreeViewer`通常与`ContentProvider`一起使用。`...
1. **可视化展示**:它将XML文档转换为树状视图,每个元素作为一个节点,子元素作为子节点,属性以键值对的形式显示在节点旁边。这种可视化表示让开发者可以快速浏览整个文档结构。 2. **搜索功能**:用户可以通过...
`IStructuredContentProvider`负责提供树中的数据,而`LabelProvider`则用于为节点提供显示文本。例如: ```java viewer.setContentProvider(new ArrayContentProvider()); viewer.setLabelProvider(new ...
从压缩包中的文件名“给JFace TreeViewer树加上右键菜单,及实现菜单相应功能_三的世界_百度空间.htm”来看,这应该是一篇详细的教程,讲解了如何为JFace TreeViewer添加上下文(右键)菜单,并实现菜单项的点击事件...
是一款针对后缀名为.tre .tree .nwk 等树文件的打开及编辑软件
4. **添加事件监听器**:可以添加各种类型的监听器,如`SelectionListener`来处理用户的点击事件,或`ExpansionListener`来响应节点展开和折叠。 5. **刷新和更新**:使用`refresh()`和`update()`方法来动态更新树...
创建TreeViewer需要在相应的控制台上进行。首先,你需要创建一个Composite,这是一个基本的容器,可以添加其他控件。然后,通过调用`new TreeViewer(composite)`来实例化TreeViewer对象。接下来,你可以设置...
2. **初始化TreeViewer**:在Eclipse插件的初始化阶段,您需要创建一个`TreeViewer`实例,并将其附加到已存在的`Tree`控件上。这通常在`createPartControl`方法中完成。 ```java TreeViewer viewer = new ...
在成功回调中,我们初始化树形菜单,并将获取到的数据赋值给treeviewer组件的data选项,同时可以设置树节点的默认展开级别(levels),是否显示标签(showTags)以及节点被选中时的回调函数(onNodeSelected)。在...
这篇博文(尽管描述中提到的是NULL,但实际上提供了博文链接)可能详细介绍了如何创建和定制一个具有过滤能力的TreeViewer,这是一个在Eclipse RCP中用于展示数据树结构的组件。 TreeViewer在Eclipse RCP中广泛用于...
而CheckboxTreeViewer则是TreeViewer的一个扩展,它在每个树节点上添加了复选框,使得用户可以选择一个或多个节点。 【标签】中的“java插件”可能意味着CheckboxTreeViewer常用于Java开发环境中的插件开发,例如...
在给定的代码中,我们看到的是一个Eclipse插件开发的示例,具体涉及到如何在Eclipse的工作台环境中创建和管理树形视图(TreeViewer)的菜单和工具栏操作。下面我们将详细探讨这个话题。 首先,树形导航的实现通常...
在IT行业中,开发人员经常需要处理不同的数据格式,如JSON(JavaScript Object Notation)和XML(eXtensible Markup Language)。这两种格式都有其独特的优点和应用场景,但有时我们需要在它们之间进行转换,以便于...
在DragDrop事件中,接收并处理拖来的数据,例如插入或更新TreeViewer中的节点。 4. **数据格式化**: - 数据在拖放过程中需要进行序列化和反序列化。可以使用.NET的Serialization机制,或者自定义数据格式(如字符...