java - 应用程序菜单加速器和 OpenFileHandler 在 Swing 应用程序中不起作用

标签 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() 中执行(在创建我之前提到的菜单栏后,它几乎立即返回)。文件处理程序从未被调用;不是将文件拖放到停靠图标上,也不是双击文件并使用我的应用程序打开它。

我做错了什么?

最佳答案

如果您的应用没有很多框架,那么这可能是一个解决方法。

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

关于java - 应用程序菜单加速器和 OpenFileHandler 在 Swing 应用程序中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27600035/

相关文章:

c++ - 为什么 std::stoi 和 std::array 不能用 g++ c++11 编译?

java - 根据设置为 jLabel 的图标指定 jTextField 中所需的文本?

java - 如何对帖子主体对象使用@SerializedName注释

java - 如何在java 7中生成jssecacerts文件

ios - Xcode 痛苦,语法高亮损坏

java - groovy ActionListener 在一种情况下不起作用

java - JTable 无法获取主列内容的问题

java - 基于某些字段值链接 Hibernate 中不同表的好的解决方案是什么?

java - 将 File.listFiles 与 FileNameExtensionFilter 一起使用

node.js - node-gyp 重建问题编译器