Mac OS X下的JavaFX:系统菜单和模态窗口

时间:2018-03-20 15:16:20

标签: macos javafx menu modal-dialog

我目前在Mac OS X和模态对话框中遇到JavaFX菜单问题。

我正在使用方法

  

MenuBar.setUseSystemMenuBar(真)

为了使用我的应用程序菜单的系统菜单栏。这样可以正常工作但是在打开模态对话框时不会阻止菜单。即使使用

  

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程序都表现出相同的行为。他们的菜单永远不会被禁用,但对话框总是非模态的。

有没有人正确的方式(可能是根据苹果哲学的菜单和对话框)?有没有可用的解决方法或更好的解决方案?

先谢谢了 的Thorsten

1 个答案:

答案 0 :(得分:1)

我现在找到了解决问题的解决方法(或解决方案?)。我已经创建了一个方法来启用/禁用菜单:

    public void setMenuEnabled(boolean enable) {
    ObservableList<Menu> menus = menuBar.getMenus();
    for (Menu menu : menus)
        menu.setVisible(enable);
}

对于每个模态对话框,我首先调用方法来禁用菜单,然后显示对话框,最后再次启用菜单。

    setMenuEnabled(false);
    mydialog.showAndWait();
    setMenuEnabled(true);

是的,我扩展了我的模态对话框的类,如Stage或Dialog,并添加了代码以自动禁用/启用菜单:

public ModalStage extends Stage {
   private MyController myController;

   public ModalStage(MyController myController) {
        this.myController = myController;
        addEventHandler(WindowEvent.WINDOW_SHOWN, new EventHandler<WindowEvent>() {
        @Override
        public void handle(WindowEvent window) {
            myController.setMenuEnabled(false);
        }
    });
    addEventHandler(WindowEvent.WINDOW_HIDDEN, new EventHandler<WindowEvent>() {
        @Override
        public void handle(WindowEvent window) {
            myController.setMenuEnabled(true);
        }
    });
}

也许我的问题有更好的解决方案,但目前我不知道其他任何问题;)