Как реализовать приложение 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.)