讨论不仅仅是问题。答案可能是肯定的,除非有其他可能的方法或更好的方法。
单击“确定”后需要做一些工作的非阻塞对话框的通常方法是什么?
阻止对话框可以返回结果。
Optional<ButtonType> result = dialog.showAndWait();
我在考虑将对话框设计从阻塞改为非阻塞,我可以在Dialog中实现一个ActionEvent来执行工作并将其设置为OK按钮onAction。
那是最好的方法吗?考虑到onClosingEvent无法知道单击了哪个按钮(“确定”或“取消”),我认为没有其他方法。
getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL);
final Button okButton = (Button) getDialogPane().lookupButton(ButtonType.OK);
okButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
//Do the work that normally would be done outside of the Dialog on returned Optional<ButtonType>
}
});
也许最好从实例化对话框的对话框中获取“确定”按钮,然后在其中添加ActionEvent。这样,您可以同时使用showAndWait()和show()。如果ActionEvent位于对话框中,则showAndWait返回的结果将不再是多余的或不再可用。
MyDialog dialog = new Dialog();
Button okButton = dialog.getOkButton();
okButton.setOnAction();
https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/Dialog.html
JavaFX对话框默认为模式对话框(您可以通过initModality(javafx.stage.Modality)API进行更改)。要指定是要阻止对话框还是非阻止对话框,开发人员只需选择分别调用showAndWait()或show()即可。默认情况下,鉴于在这些情况下的编码简便性,大多数开发人员应选择使用showAndWait()。下面显示的是三个代码段,显示了三种同样有效的对话框显示方式:
更新07/02/2019
在使用JFoenix JFXDialog时(这是非阻塞的),我尝试使用CompletableFuture等待结果。
final CompletableFuture<String> resultFuture = createDialog();
final String result = resultFuture.get(); // This could be placed in a Task<Void> to keep it non-blocking.
public CompletableFuture<String> createDialog() {
final CompletableFuture<String> messageFuture = new CompletableFuture<>();
okButton.setOnAction(event -> {
messageFuture.complete(textField.getText());
dialog.close();
});
return messageFuture;
}
在我创建JFXDialog的地方创建了CompletableFuture,然后返回。 对话框上的“确定”和“取消”按钮正在调用resultFuture.cancel或resultFuture.complete
答案 0 :(得分:1)
一种选择是监听result
属性。
一个属性,表示从对话框返回的内容。通过result converter生成结果,该结果旨在将用户单击的
ButtonType
转换为类型R的值。有关更多详细信息,请参考Dialog
类JavaDoc。
如果Dialog
的结果类型为ButtonType
(例如使用Alert
时),则您将知道直接按下了什么按钮。否则,结果转换器负责根据所按下的按钮确定结果。这意味着您可以将结果转换器与侦听结果结合起来,以便在设置结果后执行适当的操作。