我目前在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
答案 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);
}
});
}
也许我的问题有更好的解决方案,但目前我不知道其他任何问题;)