Eclipse RCP打开OLE(Word)后主菜单消失,如何避免?
解决Eclipse RCP中OLE打开Word文档时菜单消失的问题
问题根源
使用OLE.OLEIVERB_INPLACEACTIVATE就地激活Word文档时,OLE控件会接管窗口的部分消息处理,干扰E4框架对菜单的焦点感知逻辑,导致e4xmi中定义的菜单被隐藏。独立SWT示例无E4的DI/EMF菜单管理机制,因此不受影响。
可行解决方案
1. 切换OLE激活模式
改用OLEIVERB_OPEN让Word在独立窗口运行,避免抢占RCP菜单控制权:
oleClientSite.doVerb(OLE.OLEIVERB_OPEN);
优点是完全规避菜单冲突,缺点是文档无法内嵌显示。
2. 焦点事件触发菜单刷新
保留内嵌激活的前提下,监听OLE控件焦点变化,强制刷新E4菜单:
oleClientSite.addFocusListener(new FocusAdapter() { @Override public void focusGained(FocusEvent e) { refreshE4Menu(); } @Override public void focusLost(FocusEvent e) { refreshE4Menu(); } private void refreshE4Menu() { MenuService menuService = PlatformUI.getWorkbench().getService(MenuService.class); if (menuService != null) { // 替换为你在e4xmi中定义的菜单ID menuService.refreshContributions("your.menu.identifier"); } } });
需将your.menu.identifier替换为e4xmi中菜单元素的实际ID。
3. 调整OLE控件样式
添加SWT.NO_FOCUS标记,减少OLE控件对RCP焦点管理的干扰:
oleClientSite = new OleClientSite(oleFrame, SWT.NO_FOCUS | SWT.NONE, "Word.Document", file);
注意此设置可能影响文档编辑的交互性,需测试验证。
4. 检查e4xmi菜单可见性规则
打开Application.e4xmi,查看对应菜单的Visible When表达式,若存在基于焦点/活动部件的隐藏逻辑,调整为宽松条件(例如直接设为true),确保菜单始终可见。
内容的提问来源于stack exchange,提问作者Bernard85




