Дискуссия больше, чем вопрос.Ответом может быть просто «Да», если нет других возможных подходов или они лучше.
Каков обычно подход к неблокирующему диалогу, который должен выполнить некоторую работу после нажатия ОК?
Aдиалоговое окно блокировки может вернуть результат.
Optional<ButtonType> result = dialog.showAndWait();
Я думал, что для того, чтобы изменить дизайн моего диалога с блокирующего на неблокирующий, я мог бы реализовать ActionEvent в своем диалоге, который выполняет эту работу и устанавливаетэто к кнопке ОК на действии.
Это лучший подход?Я не думаю, что есть какой-либо другой подход, учитывая, что onClosingEvent не может узнать, какая кнопка была нажата (OK или Отмена).
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>
}
});
Возможно, было бы лучше получить кнопку Ok из диалогового окна, в котором вы ее создали, и добавить туда 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модальный по умолчанию (вы можете изменить это через API initModality (javafx.stage.Modality)).Чтобы указать, хотите ли вы блокировать или не блокировать диалоги, разработчики просто выбирают вызов 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;
}
CompletableFuture создается, где я создаю свой JFXDialog, а затем возвращается.Кнопки OK и ОТМЕНА в диалоговом окне вызывают либо resultFuture.cancel, либо resultFuture.complete