Ускорители меню приложений и OpenFileHandler не работают в приложении Swing

1

Я пытаюсь добавить надлежащую поддержку OS X в приложение Java 8 Swing. Для этого я использую пакет com.apple:AppleJavaExtensions:1.4 от maven.

Я инициализирую панель меню, используя следующий код:

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() (который возвращается почти мгновенно после создания строки меню, о которой я упоминал ранее). Обработчик файлов никогда не называется; а не при удалении файла на значке док-станции, а также при двойном щелчке файла и открытии его с помощью моего приложения.

Что я делаю не так?

  • 0
    Проверьте наличие пропущенных / пустых обработчиков исключений.
  • 0
    Я подтверждаю, что это не работает, как ожидалось. Чтобы заставить работать горячую клавишу, необходимо использовать jframe.setJMenuBar (), что не отвечает цели использования application.setDefaultMenuBar (). Я проверил наличие необработанного исключения с помощью Thread.setDefaultUncaughtExceptionHandler () и не увидел ни одного.
Теги:
macos
swing

2 ответа

1

Если ваше приложение не имеет много кадров, это может быть обходным путем.

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

Очевидно, OpenFileHandler ничего не делает, если ваше приложение Java не запущено из пакета приложений с Info.plist, который указывает соответствующие типы CFBundleDocumentTypes. Вот пример того, как он должен выглядеть:

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

Я работал над ускорителем меню, не работая, просто зарегистрировав KeyEventDispatcher на KeyboardFocusManager на каждом из окон Swing и вручную вызывая соответствующие ActionListeners, когда поймал правильный KeyEvent. Очень очень уродливо, но это работает. Я все еще удивляюсь, почему это необходимо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню