Как реализовать приложение JavaFX MacOS с системной строкой меню и обрабатывать события на рабочем столе.

Я изо всех сил пытаюсь правильно реализовать панель меню приложения в приложении JavaFX, которое работает на MacOS.

Что касается JDK9, кажется, что поддерживаемый способ правильно настроить меню приложений на Mac заключается в следующем:

1) упаковать приложение с javapackager инструмент.

2) предоставить обработчики событий для событий About/Preferences/FileOpen/Print/ и т. Д. Через API в java.awt.desktop пакет.

(Я обнаружил, что сначала нужно получить экземпляр рабочего стола-одиночки из основного потока, а не из потока JavaFX, или предоставленные обработчики событий игнорируются.)

3) Установите useSystemMenuBar переместить строку меню главной сцены вверх в системное меню Apple.

Моя проблема в том, что 2) и 3) кажутся несовместимыми друг с другом. То есть, ЛИБО я могу переместить строку меню в системную строку меню, ИЛИ я могу обработать события About/Prefs, но не оба:

import javafx.fxml.FXML
import javafx.fxml.FXMLLoader
import javafx.scene.Scene
import javafx.scene.control.MenuBar
import javafx.scene.layout.Pane
import javafx.stage.Stage

class Controller()
{
  @FXML var menubar: MenuBar = _

  def initialize(): Unit = menubar.setUseSystemMenuBar(true) // EITHER THIS
}

class Menu extends javafx.application.Application
{
  def start(stage: Stage): Unit =
  {
    val l = new FXMLLoader(getClass.getResource(s"/menu.fxml"))

    stage.setScene(new Scene(l.load[Pane]))
    stage.setTitle("Menu")
    stage.show()
  }
}

object Main
{
  def main(args: Array[String]) =
  {
    val d= java.awt.Desktop.getDesktop // OR THIS

    javafx.application.Application.launch(classOf[Menu], args: _*)
  }
}

Что тут происходит?

Документация, доступная онлайн (от Apple, из Oracle и т. Д.), Является непостоянной, фрагментированной и, как правило, не очень помогает.

(Мне известна библиотека NSMenuFX Джея Гассена, и, хотя она великолепна, я не думаю, что это жизнеспособное долгосрочное решение: она использует отражение, чтобы добраться до базовой системы Glass, чтобы забрать панель меню по умолчанию, предоставляемую средой выполнения Apple, и Обезьяна с системным меню напрямую - я ожидаю, что этот метод потерпит неудачу в следующем выпуске JDK (выпуск 10?), когда отражение в недоступных классах больше не будет разрешено системой модулей времени выполнения JVM.)

0 ответов

Другие вопросы по тегам