У меня есть приложение JavaFX для Mac, и я использую NSMenuFX для создания строки меню. Я создаю свое приложение с помощью MenuToolkit. Если я использую метод setApplicationMenu, меню отображается правильно. Например, он говорит «Выйти из MyApplication» вместо Quit com.example.MyApplication. Однако у меня есть код, который отменяет закрытие приложения, если выполняются определенные условия. У меня есть EventHandler на сцене, который обрабатывает запрос on close. Если приложение не должно закрывать, WindowEvent потребляется. Проблема в том, что приложение все еще закрывается. Однако, если я не использую setApplicationMenu, меню отображается неправильно (это говорит Quit com.example.MyApplication), но использование WindowEvent прекращает закрытие приложения. Я использую Java 1.8u77. Любые идеи о том, что я делаю неправильно? Я не могу воспроизвести эту проблему в примере кода, который поставляется с NSMenuFX. Ниже приведен код, который создает панель меню.nsmenufx MenuToolkit.setApplicationMenu создает непоследовательное поведение
private void createMenu(VBox appBox) {
// Create the menubar
MenuBar menuBar = new MenuBar();
menuBar.useSystemMenuBarProperty().set(true);
MenuToolkit tk = MenuToolkit.toolkit();
String appName = "MyApplication";
Menu appMenu = new Menu(appName);
menuBar.getMenus().add(appMenu);
MenuItem aboutItem = tk.createAboutMenuItem("MyApplication");
aboutItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
AboutDialog aboutDialog = new AboutDialog(null);
aboutDialog.initOwner(stage);
aboutDialog.showAndWait();
}
});
appMenu.getItems().add(aboutItem);
appMenu.getItems().addAll(new SeparatorMenuItem(),
tk.createHideMenuItem(appName), tk.createHideOthersMenuItem(),
tk.createUnhideAllMenuItem(),
new SeparatorMenuItem(), tk.createQuitMenuItem(appName));
tk.setApplicationMenu(appMenu);
// Add the File menu
Menu file = new Menu("File");
menuBar.getMenus().add(file);
// Add the Print item
print = new MenuItem("Print");
print.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
PrinterJob job = PrinterJob.createPrinterJob();
if (job != null && job.showPrintDialog(
lineChart.getChart().getScene().getWindow())) {
boolean success = job.printPage(lineChart.getChart());
if (success) {
job.endJob();
}
}
});
file.getItems().add(print);
// Window Menu
Menu windowMenu = new Menu("Window");
windowMenu.getItems().addAll(
tk.createMinimizeMenuItem(), tk.createZoomMenuItem(),
tk.createCycleWindowsItem(), new SeparatorMenuItem(),
tk.createBringAllToFrontItem());
menuBar.getMenus().add(windowMenu);
tk.autoAddWindowMenuItems(windowMenu);
tk.setGlobalMenuBar(menuBar);
}