如何在分离视图获得焦点时在 Mac OS 上显示主菜单?
How to show main menu on Mac OS when a detached view is focused?
我有一个 Eclipse RCP 应用程序,使用 Eclipse 3.8,在 Mac OS 上,主菜单栏仅在主 window 获得焦点时显示。当我将焦点更改为分离的 window 时,菜单栏消失了。
所以,我明白Mac根据焦点window显示菜单,如果window不提供菜单栏,什么都不显示。
在 Eclipse 上,行为是相同的。
主要 window 重点:https://i.stack.imgur.com/4aRMa.png
分离 window 专注:https://i.stack.imgur.com/easMD.png
有没有办法设置主菜单而不考虑焦点视图?
我们找到了执行此操作的方法,但您必须分支 SWT 的本地副本。
首先我们获取到活动的workbenchwindow菜单栏:
Menu menuBar = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().getMenuBar();
直接在 shell 上设置它,使用 .setMenuBar( menuBar )
将不起作用,因为它会检查菜单的父项并抛出 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);
}
}
完成这些更改后,我们可以使用新方法在 shell 上设置活动的 workbench window 菜单栏。
我们还向我们的 shell 添加了一个处理侦听器,以确保我们从 shell 中解开菜单,以防止其被处理:
shell.addDisposeListener( event -> shell.setMenuBar( null ) );
我有一个 Eclipse RCP 应用程序,使用 Eclipse 3.8,在 Mac OS 上,主菜单栏仅在主 window 获得焦点时显示。当我将焦点更改为分离的 window 时,菜单栏消失了。
所以,我明白Mac根据焦点window显示菜单,如果window不提供菜单栏,什么都不显示。
在 Eclipse 上,行为是相同的。
主要 window 重点:https://i.stack.imgur.com/4aRMa.png
分离 window 专注:https://i.stack.imgur.com/easMD.png
有没有办法设置主菜单而不考虑焦点视图?
我们找到了执行此操作的方法,但您必须分支 SWT 的本地副本。
首先我们获取到活动的workbenchwindow菜单栏:
Menu menuBar = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().getMenuBar();
直接在 shell 上设置它,使用 .setMenuBar( menuBar )
将不起作用,因为它会检查菜单的父项并抛出 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);
}
}
完成这些更改后,我们可以使用新方法在 shell 上设置活动的 workbench window 菜单栏。
我们还向我们的 shell 添加了一个处理侦听器,以确保我们从 shell 中解开菜单,以防止其被处理:
shell.addDisposeListener( event -> shell.setMenuBar( null ) );