Eclipse RCP工具栏状态无法通过代码触发更新问题排查
解决方法
你的代码存在两处关键问题,修正后即可正常触发工具栏的状态更新:
requestEvaluation参数错误
你传入的是PropertyTester的ID,但该方法需要的是属性测试的完整表达式字符串,也就是你在visibleWhen节点中使用的com.aaa.bbb.ccc.MyTester.isValid,而非测试器本身的ID。缺少视图工具栏的强制刷新
仅刷新命令和请求表达式评估可能无法立即触发视图工具栏的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
相关产品推荐
相关产品推荐

