JavaFX Dialog getResult () метод не возвращает правильный универсальный тип - PullRequest
0 голосов
/ 15 сентября 2018

У меня проблема с классом JavaFX Dialog<R>.Я создал диалог с пользовательским параметром типа, скажем String для простоты.Теперь, когда я пытаюсь получить результат диалога, я получаю ClassCastException.

. Возьмем это простое приложение JavaFX:

@Override
public void start(Stage primaryStage) {
    Dialog<String> dialog = new Dialog<>();
    dialog.getDialogPane().getButtonTypes().setAll(ButtonType.OK);
    String result = dialog.showAndWait().orElse(null);
}

. Когда я нажимаю кнопку ОК, у меня появляется ошибка.стек, который приводит к:

Caused by: java.lang.ClassCastException: javafx.scene.control.ButtonType cannot be cast to java.lang.String

Само собой разумеется, код компилируется отлично.Кажется, что при каждом нажатии кнопки ОК значение диалогового окна принудительно устанавливается на что-то типа ButtonType.Не тот тип, который вы ожидаете, зная сигнатуру метода.

Это также верно, если я использую метод getResult() после отображения диалогового окна.

Я использую JVM Oracle 1.8.0_151.

Спасибо за любые идеи.

1 Ответ

0 голосов
/ 15 сентября 2018

API Dialog требует, чтобы вы установили обратный вызов конвертера результатов, если тип не Void или ButtonType.Чтобы запустить ваш пример:

@Override
public void start(Stage primaryStage) {
    Dialog<String> dialog = new Dialog<>();
    dialog.getDialogPane().getButtonTypes().setAll(ButtonType.OK);
    dialog.setResultConverter(ButtonType::getText);
    String result = dialog.showAndWait().orElse(null);
    System.out.println(result);
}

В приведенном выше фрагменте result содержит значение OK.Это вряд ли более полезно, чем ButtonType в качестве аргумента типа.Если вы хотите получить объект домена из Dialog, более идиоматический подход состоит в том, чтобы прикрепить событие к кнопке ОК, выполнить проверку входных данных и вычислить объект результата в обработчике событий.В документации перечислены три способа достижения этого.

...