系统相关
首页 > 系统相关> > java – 制作OS X屏幕的最佳方法JMenuBar在Windows中一致地工作?

java – 制作OS X屏幕的最佳方法JMenuBar在Windows中一致地工作?

作者:互联网

我有一个带有Swing用户界面的跨平台Java应用程序.在OS X上,应用程序uses the screen menu bar提供更原生的用户体验.

通常,应用程序为每个文档创建一个JFrame.屏幕菜单栏必须在所有这些窗口中保持一致.我已经尝试了几种方法,并且只找到了一种一致且高效的解决方案,这种解决方案已足够但不完美.我发布这个问题,万一其他人有更好的方法,并希望这些信息有助于其他人.

一些不起作用的方法:

将相同的菜单栏附加到多个窗口

我尝试将相同的JMenuBar添加到多个JFrame实例,但是Swing only supports a JMenuBar being attached to a single JFrame at a time,甚至作为屏幕菜单栏.

我还使用AWT MenuBar而不是JMenuBar进行了测试,但也出现了同样的现象.与JMenuBar相比,MenuBar有许多限制(例如,没有图标),所以让我们继续要求我们想要一个JMenuBar.

克隆菜单栏

一种常见的解决方案是为每个新JFrame创建JMenuBar的副本.但是,至少存在两个问题.首先,您必须保持菜单栏同步.虽然您可以使用侦听器来执行此操作,但是处理OS X平台需要大量额外的代码.然而,第二个也是更严重的问题是性能:如果你有一个包含数百个菜单项的复杂菜单栏,克隆菜单栏的速度非常慢.我们发现这种方法将新窗口的外观延迟了几秒钟!

使用默认菜单栏

Java for OS X v10.6 Update 1 and 10.5 Update 6中,Apple的Java库中添加了一种新方法:Application.setDefaultMenuBar(JMenuBar).

此方法的目的是在没有活动JFrame时提供菜单栏,但是当没有自己的JMenuBar的JFrame处于活动状态时,它还会显示默认菜单栏.

但是,setDefaultMenuBar功能存在几个主要问题:

> Accelerators do not work.我在handling all key presses ourselves的申请中避免了这个问题,但仍然不幸.
>截至2012年12月,setDefaultMenuBar was still not available on Java7.我们显然希望避免使用已弃用或不受支持的API.
>最关键的是,调用setDefaultMenuBar prevents the JVM from shutting down properly.即使后续调用setDefaultMenuBar(null)也不会释放必要的资源.

简而言之,setDefaultMenuBar似乎并不是一种安全可靠的方法.

因此,问题是:实现一致的屏幕JMenuBar的最可靠,最高性能和兼容性(跨OS X版本)的方式是什么?

解决方法:

您可以利用继承其父JMenuBar的JDialog.要使对话框保持无模式,您可以使用

> PropertyChangeEvent在对话框和主JFrame之间进行通信,如建议here.
> ActionKey Bindings在对话框之间导航.

标签:java,macos,swing,menubar,jmenubar
来源: https://codeday.me/bug/20190901/1779861.html