单击确定后,JavaFX Non-Blocking对话框即可处理结果

时间:2018-12-19 14:19:40

标签: java javafx

讨论不仅仅是问题。答案可能是肯定的,除非有其他可能的方法或更好的方法。

单击“确定”后需要做一些工作的非阻塞对话框的通常方法是什么?

阻止对话框可以返回结果。

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

1 个答案:

答案 0 :(得分:1)

一种选择是监听result属性。

  

一个属性,表示从对话框返回的内容。通过result converter生成结果,该结果旨在将用户单击的ButtonType转换为类型R的值。有关更多详细信息,请参考Dialog类JavaDoc。

如果Dialog的结果类型为ButtonType(例如使用Alert时),则您将知道直接按下了什么按钮。否则,结果转换器负责根据所按下的按钮确定结果。这意味着您可以将结果转换器与侦听结果结合起来,以便在设置结果后执行适当的操作。