RCP - 正确的注册监听器不是来自视图

时间:2010-02-04 11:54:10

标签: eclipse-rcp listener

我尝试从单独的插件注册我的类PostSelectionListener(这个类不是视图,只是简单的类),我用这个:

Workbench.getInstance().getActiveWorkbenchWindow().getSelectionService().
    addPostSelectionListener(VIEWS_VISUALIZATION_TYP_ID, this);

它工作正常,但我有一个警告:

- Discouraged access: The method getActiveWorkbenchWindow() 
from the type Workbench is not accessible due to restriction on required library F:
  \elipseSource\plugins\org.eclipse.ui.workbench_3.5.1.M20090826-0800a.jar
- Discouraged access: The method getInstance() 
from the type Workbench is not accessible due to restriction on required library F:\elipseSource\plugins
  \org.eclipse.ui.workbench_3.5.1.M20090826-0800a.jar
- Discouraged access: The type Workbench is not accessible 
due to restriction on required library F:\elipseSource\plugins
  \org.eclipse.ui.workbench_3.5.1.M20090826-0800a.jar

如何以正确的方式注册听众?

2 个答案:

答案 0 :(得分:4)

我找到了一个解决方案,而不是

  

Workbench.getInstance()

我应该使用:

  

PlatformUI.getWorkbench()

我是RCP初学者,所以对我来说并不明显

答案 1 :(得分:2)

检查这是否是MANFEST.MF代问题(请参阅this thread

  

打开基础项目的MANIFEST.MF并查看“运行时”选项卡   要在其他插件中访问的软件包应列为“导出的软件包”。

尝试重新计算正确的导出包列表。

如果这不起作用,如this thread中所述,您仍然可以选择de-activate the warning

  • Windows - >偏好 - > Java - >编译器 - >错误/警告
  • (或:项目)属性 - > Java编译器 - >错误/警告

alt text

  

“警告”或“忽略”选项只会通过允许项目使用忽略预定义访问规则的任何类来隐藏项目中的潜在问题。
  要完全解决此问题,请分析项目并找到受限类的使用并采取必要的操作(删除这些引用或访问规则)。


对于外部jar(不是你的情况),Potential workaround

  

如果我将Jar文件添加为外部jar并在JRE系统库之前将其移动(按导出顺序),我不会收到此错误。


实际上,OP slowik通过Workbench

访问PlatformUI服务,成功避免了依赖关系
PlatformUI.getWorkbench()

而不是Workbench.getInstance()

您可以在rcp.util.RCPUtil类中看到此方法:

/**
 * Returns wether the ViewPart with the given id is currently visble in
 * one of the pages of the active Workbench window. Will also return
 * true when the page-book containing this view is minimized.
 *
 * @param viewID The id of the view to be queried
 * @return Wether the view is visible
 */
 public static boolean isViewVisible(String JavaDoc viewID) {
   // IWorkbenchPage[] pages = Workbench.getInstance().getActiveWorkbenchWindow().getPages();
   IWorkbenchPage[] pages = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getPages();
   for (int i = 0; i < pages.length; i++) {
     IWorkbenchPart part = pages[i].findView(viewID);
     if (part != null) {
       return isPartVisible(part);
     }
   }
   return false;
 }