我有一个使用Eclipse 3.8的Eclipse RCP应用程序,并且在Mac OS上,仅当主窗口聚焦时才显示主菜单栏。当我将焦点更改为分离的窗口时,菜单栏消失。
因此,我知道Mac会根据焦点窗口显示菜单,如果该窗口未提供菜单栏,则不会显示任何内容。
在Eclipse上,行为是相同的。
聚焦于主窗口:https://i.stack.imgur.com/4aRMa.png
已定位的独立窗口:https://i.stack.imgur.com/easMD.png
有什么方法可以设置主菜单,而无需关注焦点视图?
答案 0 :(得分:0)
我们找到了一种方法,但是您必须分支SWT的本地副本。
首先,我们获得了活动工作台窗口菜单栏:
Menu menuBar = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().getMenuBar();
使用.setMenuBar( menuBar )
将其直接设置在shell上是行不通的,因为它会检查菜单的父级并抛出IllegalArgumentException
。必须在Decorations
上创建新方法的内容,该方法是原始setMenuBar
方法的副本,减去父检查:
public void setAdoptedMenuBar( Menu menu ) {
checkWidget();
if (menuBar == menu) return;
if (menu != null) {
if (menu.isDisposed()) error(SWT.ERROR_INVALID_ARGUMENT);
if ((menu.style & SWT.BAR) == 0) error (SWT.ERROR_MENU_NOT_BAR);
}
menuBar = menu;
}
我们还必须在Shell
上添加新方法,以确保它在Decorations
上使用新方法。这是Shell.setMenuBar
的副本,第二行进行了更改。
public void setAdoptedMenuBar( Menu menu ) {
checkWidget();
super.setAdoptedMenuBar( menu );
if (display.getActiveShell () == this) {
display.setMenuBar (menuBar);
}
}
在进行了这些更改之后,我们可以使用新方法在外壳上设置活动工作台窗口菜单栏。
我们还向外壳程序添加了一个Dispose侦听器,以确保我们从外壳程序上解开菜单,以防止其被丢弃:
shell.addDisposeListener( event -> shell.setMenuBar( null ) );