应用程序菜单加速器和OpenFileHandler无法在Swing应用程序中工作

时间:2014-12-22 09:40:37

标签: java macos swing

我试图在Java 8 Swing应用程序中添加对OS X的适当支持。要做到这一点,我使用maven的com.apple:AppleJavaExtensions:1.4包。

我使用以下代码初始化菜单栏:

Application application = Application.getApplication();

JMenu fileMenu = new JMenu("File");
JMenuItem openMenuItem = new JMenuItem("Open...");
openMenuItem.addActionListener(action -> openFileDialog());
openMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.META_MASK));
fileMenu.add(openMenuItem);

JMenuBar mainMenuBar = new JMenuBar();
mainMenuBar.add(fileMenu);
application.setDefaultMenuBar(mainMenuBar);

第一次没问题,没有打开任何Swing窗口。但是,当打开一个文件(并创建一个Swing窗口)时,快捷方式将停止工作。按CMD + O仍会突出显示菜单项,但不执行该操作。用鼠标选择'打开...'菜单项 工作。我猜测Swing窗口是以某种方式窃取事件(但是当按下组合键时菜单仍然突出显示...很奇怪)。

当文件打开对话框(openFileDialog()显示)被取消时,菜单加速器将继续工作。所以它肯定与打开文件时打开的Swing窗口有关。

使用OS X打开文件的另一个问题是以下代码永远不会显示' foo':

application.setOpenFileHandler(e -> System.out.println("foo"));

此代码在main()中执行(在创建我前面提到的菜单栏后几乎立即返回)。文件处理程序没有被调用过;不是在将文件放到停靠栏图标上时,也不是在双击文件并用我的应用程序打开它时。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

如果你的应用没有很多帧,那么这可能是一种解决方法。

setJMenuBar(menuBar);
final Dimension invisible = new Dimension(0, 0);
menuBar.setSize(invisible);
menuBar.setMaximumSize(invisible);
menuBar.setPreferredSize(invisible);
menuBar.setMinimumSize(invisible);

答案 1 :(得分:0)

显然,除非您的Java应用程序是从具有指定适当CFBundleDocumentTypes的Info.plist的应用程序包运行,否则OpenFileHandler不会执行任何操作。这是一个它应该是什么样子的例子:

http://www.qtcentre.org/wiki/index.php?title=Opening_documents_in_the_Mac_OS_X_Finder

我只是在每个Swing窗口上向KeyFocusManager注册KeyEventDispatcher,并在捕获到正确的KeyEvent时手动调用相应的ActionListener,从而解决了菜单加速器无法工作的问题。非常非常难看,但它确实有效。我仍然想知道为什么这是必要的。