往eclipse的默认NavigationView中,添加右键菜单项是非常容易的,甚至不需要自己写代码,只要在plugin.xml中添加扩展项便可以了。
但是这远远达不到我们的要求。如果要我们在自己的rcp程序的View中添加右键弹出菜单就不是很容易了。现在我介绍一下如何在一个树视图中针对不同的TreeObject添加不同的右键弹出菜单的方法。
如果不清楚如何构建一个树,请参考http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/CatalogSWT-JFace-Eclipse.htm, 这里有很多关于eclipse Tree的实例。简单将来,Eclipse中创建树有两种,一种是使用SWT提供的树,依照一定的格式给其提供数据,我自己只用这种方法创建一些简单的、静态的树。另一种方法,针对于RCP程序,可以使用JFace提供的TreeViewer类,非常灵活并且易于扩展。使用TreeViewer需要实现ITreeContentProvider接口和ITreeLableProvider接口。由于我的时间有限,不能向大家提供具体的实现方法,请原谅。可以参考以下文章:http://eclipse.org/articles/treeviewer-cg/TreeViewerArticle.htm
在大体了解了如何构造一个树之后,我们下面就来介绍右键弹出菜单context menu的实现方法。
一个TreeViewer 必须继承ViewPart方法,并且重写其中的createPartControl(Composite parent)类。
1 public void createPartControl(Composite parent) {
2
3 /* Set the imput data and image model of the tree viewer,
4 * and layout the viewer on the left part of the composite.
5 */
6 viewer = new TreeViewer(parent);
7 viewer.setContentProvider(new ViewContentProvider());
8 viewer.setLabelProvider(new ViewLabelProvider());
9 viewer.setInput(createDummyModel());
10
11 createActions();
12 createMenus();
13 createContextMenu(parent);
14
15 //handles the actions related with treeviewer.
16 makeActions(parent);
17 }
其中,第7到9行为设置TreeViewer的内容提供器、图像提供器、以及初始化时的输入数据。第13行为创建右键弹出菜单。
1 private void createContextMenu(Composite parent) {
2
3 MenuManager mgr = new MenuManager();
4 mgr.setRemoveAllWhenShown(true);
5 mgr.addMenuListener(new IMenuListener() {
6 public void menuAboutToShow(IMenuManager manager) {
7 fillContextMenu(manager);
8 }
9 });
10 Menu menu = mgr.createContextMenu(viewer.getControl());
11 viewer.getControl().setMenu(menu);
12 getSite().registerContextMenu(mgr, viewer);
13 }
第4行代码中,setRemoveAllWhenShown(true)的作用是清空以前显示的菜单项,当触发了menu事件时,重新填充(fillContextMenu),所以如果不把removeAllWhenShow置为true的话,每点一下右键你就会看到菜单项多出一倍来。Menu是swt的控件,而Menumanager是Jface中的控件,不象SWT那样直接同底层打交道。用MenuManager可以创建出一个Menu对象。第十行mgr.createContextMenu(viewer.getControl());这里的viewer即为上面的viewer。第十一行,然后我们将树的setMenu方法将树控件与Menu控件联系在一起就好了。
最重要的是第十二行,这是context menu能不能显示的关键。一个视图中可以有多个context menu, 而每一个context menu都必须注册给workbench。这需要通过调用org.eclipse.ui.IWorkbenchPartSite.registerContextMenu(MenuManager menuManager, ISelectionProvider selectionProvider)或者(当有多个注册的context menu时)org.eclipse.ui.IWorkbenchPartSite.registerContextMenu(String menuId, MenuManager menuManager, ISelectionProvider selectionProvider) 增加的参数menuId用于区分不同的context menu。
接下来,我们有两种方法来创建右键弹出菜单项。第一种,实现fillContextMenu()方法。典型的实现代码如下:
1 protected void fillContextMenu(IMenuManager manager) {
2
3 manager.add(openAction);
4 manager.add(removeAction);
5 manager.add(addAction);
6 }
这些Action都可由自己定义创建。
另外的方法,可以编辑plugin.xml文件。不需要自己写任何代码便可以显示出自己想要的弹出项。
<script type="text/javascript"></script>
分享到:
相关推荐
透视图是Eclipse RCP中的一个重要概念,它定义了工作台窗口中各视图和编辑器的布局。默认情况下,Eclipse RCP提供了标准的透视图切换方式,但开发者可以根据需求进行自定义。下面我们将逐步解析这个过程: 1. **...
视图是Eclipse RCP中显示信息的小型窗口,可以动态地显示数据。创建视图涉及定义视图的类,并实现必要的接口方法来显示内容。还可以通过代码将视图添加到特定的透视图中。 #### 使用编辑器、视图交互及模型更新 ...
#### 十九、视图、弹出菜单和动态菜单 - **视图**:理解视图在Eclipse RCP中的作用。 - **弹出菜单**:了解如何实现弹出式菜单。 - **动态菜单**:学习如何根据条件动态更改菜单项。 #### 二十、工具栏、工具控件...
此外,还可以通过`menuContribution`元素来指定菜单或工具栏的位置,如主菜单、弹出菜单或工具栏。 4. **Teamcenter中的菜单集成**:在Teamcenter的RCP环境中,菜单和工具栏的定制通常涉及到对Teamcenter API的调用...
然后,选择项目右键单击,从弹出菜单中选择"Run As" → "Eclipse Application",这样就可以在Eclipse RCP环境中运行并查看示例的运行效果了。 总结来说,这个Eclipse RCP插件开发官方示例是学习Eclipse RCP应用开发...
视图、弹出菜单和动态菜单增加了用户界面的灵活性,可以根据需要显示或隐藏菜单项。 22. **工具有栏、ToolControls 和下拉工具项** 这些组件提供了丰富的用户界面选项,如按钮、复选框、下拉列表等,它们可以...
命令可以插入到主菜单、子菜单或者弹出菜单中。通过在`.menu.xml`文件中添加命令ID,可以将命令显示为菜单项。同时,可以设置命令的可见性和启用状态,这些状态可以通过核心表达式或自定义表达式来动态控制。 3 ...
在弹出的对话框中,为你的项目输入一个名称,比如"HelloWorld",取消勾选"Create module-info.java file",然后点击"Next" -> "Finish"。 3. 打开项目:在左侧的"Package Explorer"视图中,展开你的项目,找到"src...
1. 要运行项目,点击"Run" > "Run Configurations...",在弹出的窗口中,右键点击"Eclipse Application",选择"New",然后输入"gef.test"。 2. 配置Main和Plug-ins,然后点击"Run"启动项目。启动后,你将看到一个...
- 上下文菜单是在用户右键点击某个元素时弹出的菜单。 - 它可以根据用户的操作上下文提供相关的选项。 **知识点2:实现上下文菜单** 1. **定义菜单项**:使用GEF提供的API来定义菜单项及其行为。 2. **绑定菜单项*...
在Eclipse中,选择“File” > “New” > “Other”,在弹出的对话框中找到“Node.js”并选择“Node.js Application”,点击“Next”。在新窗口中,为项目命名,设置项目位置,然后点击“Finish”。这将为你创建一个...