【问题标题】:JavaFX under Mac OS X: System-Menu and modal windowsMac OS X 下的 JavaFX:系统菜单和模式窗口
【发布时间】: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


    【解决方案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);
            }
        });
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 2011-08-03
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      • 2011-11-13
      • 2015-04-30
      相关资源
      最近更新 更多