文章转载自:http://solonote.javaeye.com/blog/150906 作者:solonote
这几天一直在研究popupMenu的Action,想要达到的目是选中不同的东西弹出不同的菜单。网上有很多介绍的文章,不过很多文章都是一些翻译过来并且作者没有自己实践过的东西,浪费了我很多时间,最后自己通过摸索,终于找出了这个问题的解决办法。
1.文章类型:
这是一篇解决问题的教程,不讨论技术的背景知识,比如运用到何种设计模式,以及实现背后的原理等问题。
2.此文对您的帮助:
看完此文后您将能够创建一个由选择内容指定弹出项的动态菜单。
setp1.创建一个rcp工程,模板使用有一个view的
step2.创建popupMenu
step2_1.新建类Action1:
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. }
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>
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类
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. //设置选择提供者和弹出菜单
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. //设置选择提供者和弹出菜单