为什么我无法以编程方式关闭JavaFX上的Dialog?

时间:2015-02-24 14:15:14

标签: java javafx

此代码示例显示但未关闭JavaFx上的javafx.scene.control.Dialog:

Dialog<Void> dialog = new Dialog<Void>();
dialog.show();
dialog.close();

Dialog<Void> dialog = new Dialog<Void>();
dialog.show();
dialog.hide();

为什么?

5 个答案:

答案 0 :(得分:20)

我不确定为什么上面的回答被标记为答案,因为它显然没有回答这个问题。基本问题似乎是无法以编程方式关闭没有“关闭/取消”按钮的对话框:

对话框打开,但不关闭:

Dialog<Void> dialog = new Dialog<Void>();
dialog.show();
dialog.close();                     

要关闭,请在关闭之前为其添加取消按钮:

Dialog<Void> dialog = new Dialog<Void>();
dialog.show();
// Add dummy cancel button
dialog.getDialogPane().getButtonTypes().addAll(ButtonType.CANCEL);
// Dialog will now close
dialog.close(); 

答案 1 :(得分:10)

更短(但不是更少&#34; hacky&#34;方法)是使用特定类型的对话框(除了Void)并在隐藏它之前直接设置(任意)结果,例如:

Dialog<Boolean> dialog = new Dialog<Boolean>();
dialog.show();
...
// for closing
dialog.setResult(Boolean.TRUE);
dialog.close();

答案 2 :(得分:1)

如上所述,您应该添加按钮

Dialog<Void> dialog = new Dialog<Void>();
dialog.getDialogPane().getButtonTypes().add(ButtonType.CLOSE);
dialog.showAndWait();

如果该设计完全没有意义,您可以隐藏按钮

Dialog<Void> dialog = new Dialog<Void>();
dialog.getDialogPane().getButtonTypes().add(ButtonType.CLOSE);

Node closeButton = dialog.getDialogPane().lookupButton(ButtonType.CLOSE);
closeButton.setVisible(false);

dialog.showAndWait();

您也可以直接使用窗口

Dialog<Void> dialog = new Dialog<Void>();

Window window = dialog.getDialogPane().getScene().getWindow();
window.setOnCloseRequest((e) -> {
    dialog.hide();
});

dialog.showAndWait();

最后的解决方案是创建自己的对话框窗口

Stage dialog = new Stage();
dialog.initModality(Modality.APPLICATION_MODAL);
dialog.setResizable(false);

VBox root = new VBox();
Scene dialogScene = new Scene(root);

Button close = new Button("Close");
close.setOnAction((e) -> {
    dialog.close();
});

root.getChildren().addAll(close);
dialog.setScene(dialogScene);
dialog.showAndWait();

答案 3 :(得分:0)

来自javadoc:

  

通常,对话框以模态和阻塞的方式显示。 “模态”表示对话框阻止用户在显示时与拥有的应用程序进行交互,“阻止”表示代码执行在对话框显示时停止

(强调我的)

答案 4 :(得分:0)

此解决方案对我有用:

...result

建议dialog.hide(); dialog.close(); 方法在hide()中,但不在Dialog