Eclipse popupMene高级教程:使用Visibility定制弹出菜单
2008-01-07 21:32
585 查看
文章转载自: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>
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代码
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代码
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
这篇文章欢迎转载和分享,转载时请写明作者和出处,感谢.
这几天一直在研究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>
<?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代码
<!-- 弹出菜单的定义 --> <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代码
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
这篇文章欢迎转载和分享,转载时请写明作者和出处,感谢.
相关文章推荐
- Eclipse popupMene高级教程:使用Visibility定制弹出菜单
- 使用QStyle高端定制弹出菜单 QMenu源码剖析(二)
- 关于Ubuntu13.10运行eclipse时菜单无法使用的解决办法
- 【Android Studio使用教程5】使用SDK Manager时, SDK下载更新不了的解决方案(eclipse 也适用)
- eclipse使用教程(图文)
- Eclipse 使用git 教程
- 4.3 使用旋转菜单命令绘制药丸图标 [Illustrator CC教程]
- Android高手进阶教程(六)之----Android 中MenuInflater的使用(布局定义菜单)!
- 关于在Eclipse下使用Subversion教程(3)
- AjaxControlToolkit 微软出的ajax.net 工具使用教程十四 PopupControlExtender(弹出) 控件的使用
- 在Eclipse中安装Maven插件及使用外置Maven教程
- JProfiler入门使用教程:Eclipse集成
- 菜鸟教程之工具使用(六)——让Maven项目直接在eclipse内部的Tomcat中执行
- Java剖析工具JProfiler入门使用教程:与Eclipse 3.2 集成
- Android基础入门教程——2.4.15 DrawerLayout(官方侧滑菜单)的简单使用
- 在Eclipse中使用JUnit4进行单元测试(高级篇)
- Spket Eclipse插件使用教程
- (转)UIMenuController的使用,对UILabel拷贝以及定制菜单
- android开发定制关机弹出菜单