聚焦分离视图时如何在Mac OS上显示主菜单?

时间:2019-12-03 12:49:48

标签: java eclipse macos swt eclipse-rcp

我有一个使用Eclipse 3.8的Eclipse RCP应用程序,并且在Mac OS上,仅当主窗口聚焦时才显示主菜单栏。当我将焦点更改为分离的窗口时,菜单栏消失。

因此,我知道Mac会根据焦点窗口显示菜单,如果该窗口未提供菜单栏,则不会显示任何内容。

在Eclipse上,行为是相同的。

聚焦于主窗口:https://i.stack.imgur.com/4aRMa.png

已定位的独立窗口:https://i.stack.imgur.com/easMD.png

有什么方法可以设置主菜单,而无需关注焦点视图?

1 个答案:

答案 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 ) );
相关问题