You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Eclipse RCP工具栏状态无法通过代码触发更新问题排查

解决方法

你的代码存在两处关键问题,修正后即可正常触发工具栏的状态更新:

  1. requestEvaluation参数错误
    你传入的是PropertyTester的ID,但该方法需要的是属性测试的完整表达式字符串,也就是你在visibleWhen节点中使用的com.aaa.bbb.ccc.MyTester.isValid,而非测试器本身的ID。

  2. 缺少视图工具栏的强制刷新
    仅刷新命令和请求表达式评估可能无法立即触发视图工具栏的UI更新,需要主动获取目标视图的工具栏管理器并调用更新方法。

修正后的代码如下:

Display.getDefault().syncExec(new Runnable() {
    @Override
    public void run() {
        IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
        if (window == null) return;

        // 刷新命令元素
        ICommandService commandService = window.getService(ICommandService.class);
        if (commandService != null) {
            commandService.refreshElements("com.aaa.bbb.ccc.MyCommand", null);
        }

        // 正确请求属性表达式评估
        IEvaluationService evaluationService = window.getService(IEvaluationService.class);
        if (evaluationService != null) {
            evaluationService.requestEvaluation("com.aaa.bbb.ccc.MyTester.isValid");
        }

        // 强制刷新目标视图的工具栏
        IWorkbenchPage page = window.getActivePage();
        if (page != null) {
            IViewPart view = page.findView("com.aaa.bbb.ccc.MyView");
            if (view != null) {
                IToolBarManager toolBarManager = view.getViewSite().getActionBars().getToolBarManager();
                toolBarManager.update(true);
            }
        }
    }
});

额外注意事项:

  • 确保MyTester的isValid方法逻辑正确,状态变化时能返回对应布尔值。
  • 如果MyHandler的isEnabled状态也需要同步更新,可在代码中添加commandService.refreshCommand("com.aaa.bbb.ccc.MyCommand", null);来强制刷新命令的启用状态。

内容的提问来源于stack exchange,提问作者Dave Carpeneto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 16:25:54