【问题标题】:Eclipse RCP menu command is displayed as active although the command is not enabled尽管未启用该命令,但 Eclipse RCP 菜单命令显示为活动状态
【发布时间】:2014-12-03 11:06:59
【问题描述】:

我对菜单命令有一个奇怪的问题。

我想创建一个在某些条件下有效但在其他条件下无效的菜单命令(例如:关闭命令在打开特定实体时有效,但在没有此类实体时无效)

我尝试了两种策略:

  • 覆盖处理程序的isEnabled() 方法以包含应该告诉它命令是否处于活动状态的逻辑

  • 扩展一个 AbstractSourceProvider 监听状态并更改提供的变量。

在这两种方法中,代码都可以正常工作,菜单贡献被激活和停用。但是,这就是问题所在,只有当我切换到另一个应用程序(alt tab 到别的东西)并切换回来时,它才会这样做。如果不执行此切换,则仅命令处于非活动状态,但菜单贡献仍将其显示为活动状态,从而导致 NotEnabledException

SourceProviderApproach 扩展点如下所示:

 <extension
     point="org.eclipse.ui.menus">
  <menuContribution
        locationURI="menu:org.eclipse.ui.main.menu?before=window">
     <menu
           label="File">
        <command
              commandId="profile.close"
              label="Close"
              style="push">
           <activeWhen
              checkEnabled="false">
           <with
                 variable="profile.gui.ActiveProfile">
              <equals
                    value="active">
              </equals>
           </with>
        </activeWhen>
        </command>
  </menuContribution>
</extension>

如果我将其更改为 validWhen 一切正常,则该命令会显示并相应地隐藏。但如果我将其切换到activeWhen,则会出现上述情况,我必须切换到另一个应用程序并返回,以便该菜单贡献显示为活动或非活动。

我还花了 4 个小时调试 Eclipse 代码,试图找出问题所在,但我什么也没找到。

其他人是否遇到过这种情况并找到了解决方法?

谢谢, 米海

【问题讨论】:

    标签: eclipse menu command rcp


    【解决方案1】:

    org.eclipse.ui.menus 命令元素只支持 visibleWhen,不支持 activeWhen(因为 command 将被启用或处理,菜单项只是指一个命令)。

    org.eclipse.ui.handlers 支持 activeWhen(确定 如果 处理程序可以在给定点处于活动状态)和 enabledWhen(将回答处理程序启用状态基于 enabledWhen 表达式)。

    【讨论】:

      【解决方案2】:

      好的,所以我找到了解决方法。 据我所知,这是一个 Eclipse 错误。在某些情况下,它会根据底层关联的命令状态触发标签更新(如果命令被禁用,标签也应该被禁用),就像在最小化窗口时一样,但在某些情况下它不会,比如当您在命令之后调用菜单时已被禁用。

      所以临时解决办法是手动触发菜单的填充。这可以通过以下代码 sn-p 来完成:

          public static void refillAllActionBars() {
              IWorkbench workbench = PlatformUI.getWorkbench();
              WorkbenchWindow ww = (WorkbenchWindow)workbench.getActiveWorkbenchWindow();
      
              ww.fillActionBars(ActionBarAdvisor.FILL_STATUS_LINE);
      }
      

      只需三行代码就可以进行大量窥探:(

      【讨论】:

      • 这会访问内部代码,AFAIK 甚至无法在 WorkbenchWindow 已被替换的 Eclipse 4.x 中工作。
      猜你喜欢
      • 1970-01-01
      • 2016-08-04
      • 2017-01-02
      • 1970-01-01
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      相关资源
      最近更新 更多