JavaFX Non-Blocking Dialog для обработки результата при нажатии Ok - PullRequest
0 голосов
/ 19 декабря 2018

Дискуссия больше, чем вопрос.Ответом может быть просто «Да», если нет других возможных подходов или они лучше.

Каков обычно подход к неблокирующему диалогу, который должен выполнить некоторую работу после нажатия ОК?

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

1 Ответ

0 голосов
/ 19 декабря 2018

Одним из вариантов будет прослушивание свойства result.

Свойство, представляющее то, что было возвращено из диалогового окна.Результат генерируется с помощью конвертера результатов , который предназначен для преобразования из ButtonType, на который пользователь нажал, в значение типа R. См. Dialog класс JavaDoc для более подробной информации.

Если тип результата Dialog равен ButtonType (например, при использовании Alert), то вы будете знать, какую кнопкунажата напрямую.В противном случае преобразователь результатов отвечает за определение результата в зависимости от того, какая кнопка нажата.Это означает, что вы можете комбинировать конвертер результатов с прослушиванием результата, чтобы сделать правильную вещь, когда результат установлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...