Eclipse popupMene高级教程:使用Visibility定制弹出菜单
2013-05-07 19:48
429 查看
文章转载自:http://solonote.javaeye.com/blog/150906
作者:solonote
这几天一直在研究popupMenu的Action,想要达到的目是选中不同的东西弹出不同的菜单。网上有很多介绍的文章,不过很多文章都是一些翻译过来并且作者没有自己实践过的东西,浪费了我很多时间,最后自己通过摸索,终于找出了这个问题的解决办法。
1.文章类型:
这是一篇解决问题的教程,不讨论技术的背景知识,比如运用到何种设计模式,以及实现背后的原理等问题。
2.此文对您的帮助:
看完此文后您将能够创建一个由选择内容指定弹出项的动态菜单。
setp1.创建一个rcp工程,模板使用有一个view的
step2.创建popupMenu
step2_1.新建类Action1:
Java代码
1. package solonote.example.popupmenu;
2.
3. import org.eclipse.jface.action.IAction;
4. import org.eclipse.jface.viewers.ISelection;
5. import org.eclipse.ui.IObjectActionDelegate;
6. import org.eclipse.ui.IWorkbenchPart;
7.
8. public class Action1 implements IObjectActionDelegate {
9.
10. @Override
11. public void setActivePart(IAction action, IWorkbenchPart targetPart) {
12. // TODO Auto-generated method stub
13.
14. }
15.
16. @Override
17. public void run(IAction action) {
18. // TODO Auto-generated method stub
19.
20. }
21.
22. @Override
23. public void selectionChanged(IAction action, ISelection selection) {
24. // TODO Auto-generated method stub
25.
26. }
27.
28. }
step2_2.添加扩展点:
1. <?xml version="1.0" encoding="UTF-8"?>
2. <?eclipse version="3.2"?>
3. <plugin>
4.
5. <extension
6. id="application"
7. point="org.eclipse.core.runtime.applications">
8. <application>
9. <run
10. class="solonote.example.popupmenu.Application">
11. </run>
12. </application>
13. </extension>
14. <extension
15. point="org.eclipse.ui.perspectives">
16. <perspective
17. name="Perspective"
18. class="solonote.example.popupmenu.Perspective"
19. id="solonote.example.popupMenu.perspective">
20. </perspective>
21. </extension>
22. <extension
23. point="org.eclipse.ui.views">
24. <view
25. name="View"
26. class="solonote.example.popupmenu.View"
27. id="solonote.example.popupMenu.view">
28. </view>
29. </extension>
30. <!-- 弹出菜单的定义 -->
31. <extension
32. point="org.eclipse.ui.popupMenus">
33. <objectContribution
34. id="objectContribution"
35. objectClass="java.lang.Object">
36. <action
37. class="solonote.example.popupmenu.Action1"
38. id="solonote.example.popupMenu.action1"
39. label="label">
40. </action>
41. </objectContribution>
42. </extension>
43.
44. </plugin>
[java] view
plaincopy
<?xml version="1.0" encoding="UTF-8"?> <?eclipse version="3.2"?> <plugin> <extension id="application" point="org.eclipse.core.runtime.applications"> <application> <run class="solonote.example.popupmenu.Application"> </run> </application> </extension> <extension point="org.eclipse.ui.perspectives"> <perspective name="Perspective" class="solonote.example.popupmenu.Perspective" id="solonote.example.popupMenu.perspective"> </perspective> </extension> <extension point="org.eclipse.ui.views"> <view name="View" class="solonote.example.popupmenu.View" id="solonote.example.popupMenu.view"> </view> </extension> <!-- 弹出菜单的定义 --> <extension point="org.eclipse.ui.popupMenus"> <objectContribution id="objectContribution" objectClass="java.lang.Object"> <action class="solonote.example.popupmenu.Action1" id="solonote.example.popupMenu.action1" label="label"> </action> </objectContribution> </extension> </plugin>
step2_3设置弹出菜单的弹出位置
修改View类
Java代码
1. package solonote.example.popupmenu;
2.
3. import org.eclipse.jface.action.MenuManager;
4. import org.eclipse.jface.viewers.IStructuredContentProvider;
5. import org.eclipse.jface.viewers.ITableLabelProvider;
6. import org.eclipse.jface.viewers.LabelProvider;
7. import org.eclipse.jface.viewers.TableViewer;
8. import org.eclipse.jface.viewers.Viewer;
9. import org.eclipse.swt.SWT;
10. import org.eclipse.swt.graphics.Image;
11. import org.eclipse.swt.widgets.Composite;
12. import org.eclipse.swt.widgets.Menu;
13. import org.eclipse.ui.ISharedImages;
14. import org.eclipse.ui.PlatformUI;
15. import org.eclipse.ui.part.ViewPart;
16.
17. public class View extends ViewPart {
18. public static final String ID = "solonote.example.popupMenu.view";
19.
20. private TableViewer viewer;
21.
22. /**
23. * The content provider class is responsible for providing objects to the
24. * view. It can wrap existing objects in adapters or simply return objects
25. * as-is. These objects may be sensitive to the current input of the view,
26. * or ignore it and always show the same content (like Task List, for
27. * example).
28. */
29. class ViewContentProvider implements IStructuredContentProvider {
30. public void inputChanged(Viewer v, Object oldInput, Object newInput) {
31. }
32.
33. public void dispose() {
34. }
35.
36. public Object[] getElements(Object parent) {
37. return new SimpleDTO[] { new SimpleDTO("One"), new SimpleDTO("Two"),
new SimpleDTO("Three") };
38.
39. }
40. }
41.
42. class ViewLabelProvider extends LabelProvider implements
43. ITableLabelProvider {
44. public String getColumnText(Object obj, int index) {
45. SimpleDTO dto = (SimpleDTO) obj;
46. return dto.getName();
47. }
48.
49. public Image getColumnImage(Object obj, int index) {
50. return getImage(obj);
51. }
52.
53. public Image getImage(Object obj) {
54. return PlatformUI.getWorkbench().getSharedImages().getImage(
55. ISharedImages.IMG_OBJ_ELEMENT);
56. }
57. }
58.
59. /**
60. * This is a callback that will allow us to create the viewer and initialize
61. * it.
62. */
63. public void createPartControl(Composite parent) {
64. viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
65. | SWT.V_SCROLL);
66. viewer.setContentProvider(new ViewContentProvider());
67. viewer.setLabelProvider(new ViewLabelProvider());
68. viewer.setInput(getViewSite());
69.
70. //初始化弹出菜单
71. MenuManager popupMenuManager = new MenuManager("#PopupMenu");
72. popupMenuManager.setRemoveAllWhenShown(true);
73. Menu popupMenu = popupMenuManager.createContextMenu(viewer.getTable());
74. viewer.getTable().setMenu(popupMenu);
75. //设置选择提供者和弹出菜单
76. getSite().setSelectionProvider(viewer);
77. getSite().registerContextMenu(popupMenuManager, viewer);
78. }
79.
80. /**
81. * Passing the focus request to the viewer's control.
82. */
83. public void setFocus() {
84. viewer.getControl().setFocus();
85. }
86. }
好的step2已经结束了,现在您可以运行一下程序,看看效果.
接下来将要进行的是,只有选中Three时菜单才弹出,选择其他两个则不弹出。
确切的说是只有选择Three时
<objectContribution
id="objectContribution"
objectClass="java.lang.Object">
节点中的Action才显示.
接下来:
step3_1修改扩展点 增加visibility项
Java代码
[java] view
plaincopy
<!-- 弹出菜单的定义 --> <extension point="org.eclipse.ui.popupMenus"> <objectContribution id="objectContribution" objectClass="java.lang.Object"> <action class="solonote.example.popupmenu.Action1" id="solonote.example.popupMenu.action1" label="label"> </action> <visibility> <objectState name="name" value="Three"> </objectState> </visibility> </objectContribution> </extension>
1. <!-- 弹出菜单的定义 -->
2. <extension
3. point="org.eclipse.ui.popupMenus">
4. <objectContribution
5. id="objectContribution"
6. objectClass="java.lang.Object">
7. <action
8. class="solonote.example.popupmenu.Action1"
9. id="solonote.example.popupMenu.action1"
10. label="label">
11. </action>
12. <visibility>
13. <objectState
14. name="name"
15. value="Three">
16. </objectState>
17. </visibility>
18. </objectContribution>
19. </extension>
修改被选中的DTO,让其实现IActionFilter接口
Java代码
[java] view
plaincopy
package solonote.example.popupmenu; import org.eclipse.ui.IActionFilter; /** * Viewer显示的项 * @author solonote * @version 0.1.0 2007-12-26 上午11:49:41 */ public class SimpleDTO implements IActionFilter{ /** * 显示的名字 */ private String name; /** * 返回显示的名字 * @return 显示的名字 */ public String getName() { return name; } /** * 设置显示的名字 * @param name 显示的名字 */ public void setName(String name) { this.name = name; } public SimpleDTO(String name) { super(); this.name = name; } /** * 选择时候是否显示Action的判断 * <visibility> <objectState name="name" value="Three"> </objectState> </visibility> * @param target 选择的东西 * @param name plugin.xml里配置的name * @param value plugin.xml里配置的value */ @Override public boolean testAttribute(Object target, String name, String value) { System.out.println(name); System.out.println(value); System.out.println(target); SimpleDTO dto = (SimpleDTO) target; if(dto.getName().equals(value)) return true; return false; } }
1. package solonote.example.popupmenu;
2.
3. import org.eclipse.ui.IActionFilter;
4.
5. /**
6. * Viewer显示的项
7. * @author solonote
8. * @version 0.1.0 2007-12-26 上午11:49:41
9. */
10. public class SimpleDTO implements IActionFilter{
11. /**
12. * 显示的名字
13. */
14. private String name;
15.
16. /**
17. * 返回显示的名字
18. * @return 显示的名字
19. */
20. public String getName() {
21. return name;
22. }
23.
24. /**
25. * 设置显示的名字
26. * @param name 显示的名字
27. */
28. public void setName(String name) {
29. this.name = name;
30. }
31.
32. public SimpleDTO(String name) {
33. super();
34. this.name = name;
35. }
36.
37. /**
38. * 选择时候是否显示Action的判断
39. * <visibility>
40. <objectState
41. name="name"
42. value="Three">
43. </objectState>
44. </visibility>
45. * @param target 选择的东西
46. * @param name plugin.xml里配置的name
47. * @param value plugin.xml里配置的value
48. */
49. @Override
50. public boolean testAttribute(Object target, String name, String value) {
51. System.out.println(name);
52. System.out.println(value);
53. System.out.println(target);
54. SimpleDTO dto = (SimpleDTO) target;
55. if(dto.getName().equals(value))
56. return true;
57. return false;
58. }
59.
60.
61. }
然后就完成了,当然实际运用中我运用了Adapter将DTO适配成IActionFilter接口,这样DTO就不用和IActionFilter接口耦合了,或许以后的文章会接受如何适配。这里已经解决了问题,好的如果有任何疑问请联系我 solonote@163.com
这篇文章欢迎转载和分享,转载时请写明作者和出处,感谢.
然后就完成了,当然实际运用中我运用了Adapter将DTO适配成IActionFilter接口,这样DTO就不用和IActionFilter接口耦合了,或许以后的文章会接受如何适配。这里已经解决了问题,好的如果有任何疑问请联系我
描述: step2结束效果
大小: 13.1 KB
popupMenu.zip (21.2 KB)
描述: eclipse工程
下载次数: 277
查看图片附件
作者:solonote
这几天一直在研究popupMenu的Action,想要达到的目是选中不同的东西弹出不同的菜单。网上有很多介绍的文章,不过很多文章都是一些翻译过来并且作者没有自己实践过的东西,浪费了我很多时间,最后自己通过摸索,终于找出了这个问题的解决办法。
1.文章类型:
这是一篇解决问题的教程,不讨论技术的背景知识,比如运用到何种设计模式,以及实现背后的原理等问题。
2.此文对您的帮助:
看完此文后您将能够创建一个由选择内容指定弹出项的动态菜单。
setp1.创建一个rcp工程,模板使用有一个view的
step2.创建popupMenu
step2_1.新建类Action1:
Java代码
1. package solonote.example.popupmenu;
2.
3. import org.eclipse.jface.action.IAction;
4. import org.eclipse.jface.viewers.ISelection;
5. import org.eclipse.ui.IObjectActionDelegate;
6. import org.eclipse.ui.IWorkbenchPart;
7.
8. public class Action1 implements IObjectActionDelegate {
9.
10. @Override
11. public void setActivePart(IAction action, IWorkbenchPart targetPart) {
12. // TODO Auto-generated method stub
13.
14. }
15.
16. @Override
17. public void run(IAction action) {
18. // TODO Auto-generated method stub
19.
20. }
21.
22. @Override
23. public void selectionChanged(IAction action, ISelection selection) {
24. // TODO Auto-generated method stub
25.
26. }
27.
28. }
step2_2.添加扩展点:
1. <?xml version="1.0" encoding="UTF-8"?>
2. <?eclipse version="3.2"?>
3. <plugin>
4.
5. <extension
6. id="application"
7. point="org.eclipse.core.runtime.applications">
8. <application>
9. <run
10. class="solonote.example.popupmenu.Application">
11. </run>
12. </application>
13. </extension>
14. <extension
15. point="org.eclipse.ui.perspectives">
16. <perspective
17. name="Perspective"
18. class="solonote.example.popupmenu.Perspective"
19. id="solonote.example.popupMenu.perspective">
20. </perspective>
21. </extension>
22. <extension
23. point="org.eclipse.ui.views">
24. <view
25. name="View"
26. class="solonote.example.popupmenu.View"
27. id="solonote.example.popupMenu.view">
28. </view>
29. </extension>
30. <!-- 弹出菜单的定义 -->
31. <extension
32. point="org.eclipse.ui.popupMenus">
33. <objectContribution
34. id="objectContribution"
35. objectClass="java.lang.Object">
36. <action
37. class="solonote.example.popupmenu.Action1"
38. id="solonote.example.popupMenu.action1"
39. label="label">
40. </action>
41. </objectContribution>
42. </extension>
43.
44. </plugin>
[java] view
plaincopy
<?xml version="1.0" encoding="UTF-8"?> <?eclipse version="3.2"?> <plugin> <extension id="application" point="org.eclipse.core.runtime.applications"> <application> <run class="solonote.example.popupmenu.Application"> </run> </application> </extension> <extension point="org.eclipse.ui.perspectives"> <perspective name="Perspective" class="solonote.example.popupmenu.Perspective" id="solonote.example.popupMenu.perspective"> </perspective> </extension> <extension point="org.eclipse.ui.views"> <view name="View" class="solonote.example.popupmenu.View" id="solonote.example.popupMenu.view"> </view> </extension> <!-- 弹出菜单的定义 --> <extension point="org.eclipse.ui.popupMenus"> <objectContribution id="objectContribution" objectClass="java.lang.Object"> <action class="solonote.example.popupmenu.Action1" id="solonote.example.popupMenu.action1" label="label"> </action> </objectContribution> </extension> </plugin>
step2_3设置弹出菜单的弹出位置
修改View类
Java代码
1. package solonote.example.popupmenu;
2.
3. import org.eclipse.jface.action.MenuManager;
4. import org.eclipse.jface.viewers.IStructuredContentProvider;
5. import org.eclipse.jface.viewers.ITableLabelProvider;
6. import org.eclipse.jface.viewers.LabelProvider;
7. import org.eclipse.jface.viewers.TableViewer;
8. import org.eclipse.jface.viewers.Viewer;
9. import org.eclipse.swt.SWT;
10. import org.eclipse.swt.graphics.Image;
11. import org.eclipse.swt.widgets.Composite;
12. import org.eclipse.swt.widgets.Menu;
13. import org.eclipse.ui.ISharedImages;
14. import org.eclipse.ui.PlatformUI;
15. import org.eclipse.ui.part.ViewPart;
16.
17. public class View extends ViewPart {
18. public static final String ID = "solonote.example.popupMenu.view";
19.
20. private TableViewer viewer;
21.
22. /**
23. * The content provider class is responsible for providing objects to the
24. * view. It can wrap existing objects in adapters or simply return objects
25. * as-is. These objects may be sensitive to the current input of the view,
26. * or ignore it and always show the same content (like Task List, for
27. * example).
28. */
29. class ViewContentProvider implements IStructuredContentProvider {
30. public void inputChanged(Viewer v, Object oldInput, Object newInput) {
31. }
32.
33. public void dispose() {
34. }
35.
36. public Object[] getElements(Object parent) {
37. return new SimpleDTO[] { new SimpleDTO("One"), new SimpleDTO("Two"),
new SimpleDTO("Three") };
38.
39. }
40. }
41.
42. class ViewLabelProvider extends LabelProvider implements
43. ITableLabelProvider {
44. public String getColumnText(Object obj, int index) {
45. SimpleDTO dto = (SimpleDTO) obj;
46. return dto.getName();
47. }
48.
49. public Image getColumnImage(Object obj, int index) {
50. return getImage(obj);
51. }
52.
53. public Image getImage(Object obj) {
54. return PlatformUI.getWorkbench().getSharedImages().getImage(
55. ISharedImages.IMG_OBJ_ELEMENT);
56. }
57. }
58.
59. /**
60. * This is a callback that will allow us to create the viewer and initialize
61. * it.
62. */
63. public void createPartControl(Composite parent) {
64. viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
65. | SWT.V_SCROLL);
66. viewer.setContentProvider(new ViewContentProvider());
67. viewer.setLabelProvider(new ViewLabelProvider());
68. viewer.setInput(getViewSite());
69.
70. //初始化弹出菜单
71. MenuManager popupMenuManager = new MenuManager("#PopupMenu");
72. popupMenuManager.setRemoveAllWhenShown(true);
73. Menu popupMenu = popupMenuManager.createContextMenu(viewer.getTable());
74. viewer.getTable().setMenu(popupMenu);
75. //设置选择提供者和弹出菜单
76. getSite().setSelectionProvider(viewer);
77. getSite().registerContextMenu(popupMenuManager, viewer);
78. }
79.
80. /**
81. * Passing the focus request to the viewer's control.
82. */
83. public void setFocus() {
84. viewer.getControl().setFocus();
85. }
86. }
好的step2已经结束了,现在您可以运行一下程序,看看效果.
接下来将要进行的是,只有选中Three时菜单才弹出,选择其他两个则不弹出。
确切的说是只有选择Three时
<objectContribution
id="objectContribution"
objectClass="java.lang.Object">
节点中的Action才显示.
接下来:
step3_1修改扩展点 增加visibility项
Java代码
[java] view
plaincopy
<!-- 弹出菜单的定义 --> <extension point="org.eclipse.ui.popupMenus"> <objectContribution id="objectContribution" objectClass="java.lang.Object"> <action class="solonote.example.popupmenu.Action1" id="solonote.example.popupMenu.action1" label="label"> </action> <visibility> <objectState name="name" value="Three"> </objectState> </visibility> </objectContribution> </extension>
1. <!-- 弹出菜单的定义 -->
2. <extension
3. point="org.eclipse.ui.popupMenus">
4. <objectContribution
5. id="objectContribution"
6. objectClass="java.lang.Object">
7. <action
8. class="solonote.example.popupmenu.Action1"
9. id="solonote.example.popupMenu.action1"
10. label="label">
11. </action>
12. <visibility>
13. <objectState
14. name="name"
15. value="Three">
16. </objectState>
17. </visibility>
18. </objectContribution>
19. </extension>
修改被选中的DTO,让其实现IActionFilter接口
Java代码
[java] view
plaincopy
package solonote.example.popupmenu; import org.eclipse.ui.IActionFilter; /** * Viewer显示的项 * @author solonote * @version 0.1.0 2007-12-26 上午11:49:41 */ public class SimpleDTO implements IActionFilter{ /** * 显示的名字 */ private String name; /** * 返回显示的名字 * @return 显示的名字 */ public String getName() { return name; } /** * 设置显示的名字 * @param name 显示的名字 */ public void setName(String name) { this.name = name; } public SimpleDTO(String name) { super(); this.name = name; } /** * 选择时候是否显示Action的判断 * <visibility> <objectState name="name" value="Three"> </objectState> </visibility> * @param target 选择的东西 * @param name plugin.xml里配置的name * @param value plugin.xml里配置的value */ @Override public boolean testAttribute(Object target, String name, String value) { System.out.println(name); System.out.println(value); System.out.println(target); SimpleDTO dto = (SimpleDTO) target; if(dto.getName().equals(value)) return true; return false; } }
1. package solonote.example.popupmenu;
2.
3. import org.eclipse.ui.IActionFilter;
4.
5. /**
6. * Viewer显示的项
7. * @author solonote
8. * @version 0.1.0 2007-12-26 上午11:49:41
9. */
10. public class SimpleDTO implements IActionFilter{
11. /**
12. * 显示的名字
13. */
14. private String name;
15.
16. /**
17. * 返回显示的名字
18. * @return 显示的名字
19. */
20. public String getName() {
21. return name;
22. }
23.
24. /**
25. * 设置显示的名字
26. * @param name 显示的名字
27. */
28. public void setName(String name) {
29. this.name = name;
30. }
31.
32. public SimpleDTO(String name) {
33. super();
34. this.name = name;
35. }
36.
37. /**
38. * 选择时候是否显示Action的判断
39. * <visibility>
40. <objectState
41. name="name"
42. value="Three">
43. </objectState>
44. </visibility>
45. * @param target 选择的东西
46. * @param name plugin.xml里配置的name
47. * @param value plugin.xml里配置的value
48. */
49. @Override
50. public boolean testAttribute(Object target, String name, String value) {
51. System.out.println(name);
52. System.out.println(value);
53. System.out.println(target);
54. SimpleDTO dto = (SimpleDTO) target;
55. if(dto.getName().equals(value))
56. return true;
57. return false;
58. }
59.
60.
61. }
然后就完成了,当然实际运用中我运用了Adapter将DTO适配成IActionFilter接口,这样DTO就不用和IActionFilter接口耦合了,或许以后的文章会接受如何适配。这里已经解决了问题,好的如果有任何疑问请联系我 solonote@163.com
这篇文章欢迎转载和分享,转载时请写明作者和出处,感谢.
然后就完成了,当然实际运用中我运用了Adapter将DTO适配成IActionFilter接口,这样DTO就不用和IActionFilter接口耦合了,或许以后的文章会接受如何适配。这里已经解决了问题,好的如果有任何疑问请联系我
描述: step2结束效果
大小: 13.1 KB
popupMenu.zip (21.2 KB)
描述: eclipse工程
下载次数: 277
查看图片附件
相关文章推荐
- Eclipse popupMene高级教程:使用Visibility定制弹出菜单
- 使用QStyle高端定制弹出菜单 QMenu源码剖析(二)
- Android中弹出菜单PopupWindow的使用
- J2ME中文教程 3 MIDP高级UI 的使用
- Android高手进阶教程(六)之 ----Android 中MenuInflater的使用(布局定义菜单)
- 使用CoordinatorLayout实现底部弹出菜单
- DotnetBrowser高级教程-(4)使用MVC框架3-文件上传
- [译]GLUT教程 - 弹出菜单基础
- unity3d插件Daikon Forge GUI 中文教程6-高级控件richtextlabel的使用
- UIMenuController的使用,对UILabel拷贝以及定制菜单
- Win32汇编教程五 菜单和加速键的使用
- Keil(MDK-ARM)使用教程(二)_菜单
- Dev 右键弹出菜单的使用方法
- 我的wp记录--WordPress3.0导航菜单图文使用教程
- 高级部分 侧滑菜单框架的使用 SlidingMenu
- Android 使用PopupWindow实现弹出菜单
- DotnetBrowser高级教程-(4)使用MVC框架1-搭建基础框架
- 弹出菜单的创建与使用
- java多文本框使用右键弹出菜单复制粘贴剪切功能实现
- 柯乐义高级弹出菜单(可以有三级菜单)