【发布时间】:2018-03-20 15:16:19
【问题描述】:
我目前在 Mac OS X 和模式对话框下遇到 JavaFX 菜单问题。
我正在使用方法
MenuBar.setUseSystemMenuBar(true)
为了将系统菜单栏用于我的应用程序菜单。这可以正常工作,但如果打开模式对话框,菜单不会被阻止。即使使用
initModality(Modality.APPLICATION_MODAL)
不会阻止对菜单的访问。在下面找到我的小例子:
public class MyApp extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
// scene
BorderPane borderPane = new BorderPane();
Scene scene = new Scene(borderPane);
primaryStage.setScene(scene);
// menu
MenuBar menuBar = new MenuBar();
Menu file = new Menu("File");
MenuItem open = new MenuItem("Open");
open.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
FileChooser fileDialog = new FileChooser();
fileDialog.showOpenDialog(primaryStage);
}
});
file.getItems().add(open);
Menu options = new Menu("Options");
MenuItem uioptions = new MenuItem("UI Options");
options.getItems().add(uioptions);
Menu help = new Menu("Help");
MenuItem about = new MenuItem("About");
help.getItems().add(about);
menuBar.getMenus().addAll(file, options, help);
borderPane.setTop(menuBar);
menuBar.setUseSystemMenuBar(true);
// popup
Button button = new Button("Click for Pop-up Window");
Alert alert = new Alert(AlertType.INFORMATION);
alert.setTitle("Information Dialog");
alert.setHeaderText("Look, an Information Dialog");
alert.setContentText("I have a great message for you!");
alert.initOwner(primaryStage);
alert.initModality(Modality.APPLICATION_MODAL);
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
alert.showAndWait();
}
});
borderPane.setBottom(button);
// show scene
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
我观察到的是删除线
alert.initOwner(primaryStage);
从我的示例中,当对话框打开时从我的应用程序中删除菜单。但我认为这不是正确的方法。
我认为 Mac OS X 下 Java FX 菜单的这种行为可能是有意设计的,因为所有 Mac OS 程序都显示相同的行为。他们的菜单永远不会被禁用,但对话框总是非模态的。
什么是正确的方法(可能是根据 Apple 的菜单和对话框哲学)?是否有任何变通方法或更好的解决方案?
【问题讨论】:
标签: macos javafx menu modal-dialog