У меня есть вопрос о создании модальных предупреждений в JavaFX. Моя цель - когда пользователь нажимает кнопку, чтобы отобразить диалоговое окно подтверждения модальное . Исходя из всего, что я прочитал на Inte rnet, мой код должен работать, но, к сожалению, это не так.
Мой код
Мой проект настроен вот так:
- Класс приложения : у меня есть основной класс приложения, который расширяет
Application
и является основной точкой входа для приложения. Он выполняет такие задачи, как инициализация главной сцены, инициализация основного контроллера (ниже), отображение сцены и т. Д. c. - Класс контроллера : у меня есть «основной» класс контроллера называется
MainController
. Именно здесь находится большая часть логики пользовательского интерфейса верхнего уровня c. Обратите внимание, что хотя этот close имеет связанный файл F XML, он не связан с атрибутом <fx:controller>
в F XML. Вместо этого он загружается вручную либо основным классом приложения, либо «родительским» контроллером. Для получения дополнительной информации об этом и почему я решил это сделать, см. этот вопрос StackOverflow .
В классе MainController
я пытаюсь отобразить диалоговое окно подтверждения режима. Исходя из этого ответа StackOverflow (среди прочего), я настроил свой код следующим образом (из MainController
):
/**
* Handles the action event that occurs when the reset button is clicked.
*
* @param event An ActionEvent object that represents the event.
*/
private void resetButtonClicked(ActionEvent event) {
Alert alert;
// Initialize the alert as a confirmation alert with a "yes" button and a "cancel" button.
alert = new Alert(Alert.AlertType.CONFIRMATION, "Are you sure you want to clear your unsaved " +
"changes? This action cannot be undone.", ButtonType.YES, ButtonType.CANCEL);
// Show the alert.
alert.showAndWait();
// Check if the button the user clicked was the "yes" button.
if (alert.getResult() == ButtonType.YES) {
// If it was, refresh/reset the editor.
refreshEditor();
}
}
Результат
Кажется, что это должно работать, и на самом деле это работает - частично. Диалог подтверждения отображается правильно с обеими кнопками; обе кнопки работают и запускают правильное действие. Однако предупреждение не отображается в виде диалогового окна . Под этим я подразумеваю, что я все еще могу выбирать и взаимодействовать с окном (этапом) позади оповещения.
Что я пробовал
Я пробовал Несколько вещей:
- Использование
alert.initModality()
: я попытался вызвать alert.initModality(Modality.APPLICATION_MODAL)
, чтобы указать, что диалог должен быть модальным. Это не имело никакого эффекта и не должно было быть необходимо, так как это должно было быть по умолчанию. - Использование
alert.initOwner()
: после прочтения ответа StackOverflow (я не могу вспомнить который), я попытался вызвать alert.initOwner(randomNode.getScene().getWindow())
, чтобы установить владельца диалога, если он еще не установлен. Это также не сработало. - Оба вышеперечисленных : при использовании опции (1) и опции (2) также не удалось создать модальное оповещение.
- Создание оповещения из приложения : Наконец, чтобы определить, возникла ли моя проблема из-за того, что оповещение создавалось из класса контроллера, я попытался переместить код, генерирующий оповещение, в основной класс приложения, а не в контроллер. , Это никак не повлияло и дало тот же результат, что и в контроллере.
Одна возможность
Одна возможность, о которой я подумал, почему проблема может возникнуть из-за того, что я был вынужден настроить свой проект.
Я использую Linux дистрибутив под названием Elementary OS, основанный на Ubuntu. При запуске моего приложения я обнаружил, что оно отображалось без оформления окна (например, строка заголовка, кнопка закрытия и т. Д. c.). Таким образом, чтобы исправить эту проблему, я следовал инструкциям использовать GTK 2 вместо GTK 3 в этом ответе .
Возможно ли, что это вызывает проблему?
Сводка
В итоге я пытаюсь создать диалоговое окно подтверждения модальное . Обычно код, который я использую, должен работать, но по какой-то причине это не так. Любая помощь будет принята с благодарностью!