随笔 - 6  文章 - 129  trackbacks - 0
<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(14)

随笔档案(6)

文章分类(467)

文章档案(423)

相册

收藏夹(18)

JAVA

搜索

  •  

积分与排名

  • 积分 - 822216
  • 排名 - 49

最新评论

阅读排行榜

评论排行榜

源文:http://hi.baidu.com/wyyhzc/blog/item/dbb498196a493e4042a9ad11.html
往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文件。不需要自己写任何代码便可以显示出自己想要的弹出项。
这次先讲到这里,下次介绍另外的一种实现方式。(主要是由于刚创建Blog,不知道如何插入图片,这么写太费劲也太枯燥了,相信大家一定不能忍了吧!咱们下次再见




posted on 2009-07-27 13:50 Ke 阅读(2258) 评论(0)  编辑  收藏 所属分类: eclipse RCP

只有注册用户登录后才能发表评论。


网站导航: