Проблема при создании модального оповещения JavaFX - PullRequest
0 голосов
/ 28 марта 2020

У меня есть вопрос о создании модальных предупреждений в JavaFX. Моя цель - когда пользователь нажимает кнопку, чтобы отобразить диалоговое окно подтверждения модальное . Исходя из всего, что я прочитал на Inte rnet, мой код должен работать, но, к сожалению, это не так.

Мой код

Мой проект настроен вот так:

  1. Класс приложения : у меня есть основной класс приложения, который расширяет Application и является основной точкой входа для приложения. Он выполняет такие задачи, как инициализация главной сцены, инициализация основного контроллера (ниже), отображение сцены и т. Д. c.
  2. Класс контроллера : у меня есть «основной» класс контроллера называется 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();
    }
}

Результат

Кажется, что это должно работать, и на самом деле это работает - частично. Диалог подтверждения отображается правильно с обеими кнопками; обе кнопки работают и запускают правильное действие. Однако предупреждение не отображается в виде диалогового окна . Под этим я подразумеваю, что я все еще могу выбирать и взаимодействовать с окном (этапом) позади оповещения.

Что я пробовал

Я пробовал Несколько вещей:

  1. Использование alert.initModality(): я попытался вызвать alert.initModality(Modality.APPLICATION_MODAL), чтобы указать, что диалог должен быть модальным. Это не имело никакого эффекта и не должно было быть необходимо, так как это должно было быть по умолчанию.
  2. Использование alert.initOwner(): после прочтения ответа StackOverflow (я не могу вспомнить который), я попытался вызвать alert.initOwner(randomNode.getScene().getWindow()), чтобы установить владельца диалога, если он еще не установлен. Это также не сработало.
  3. Оба вышеперечисленных : при использовании опции (1) и опции (2) также не удалось создать модальное оповещение.
  4. Создание оповещения из приложения : Наконец, чтобы определить, возникла ли моя проблема из-за того, что оповещение создавалось из класса контроллера, я попытался переместить код, генерирующий оповещение, в основной класс приложения, а не в контроллер. , Это никак не повлияло и дало тот же результат, что и в контроллере.

Одна возможность

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

Я использую Linux дистрибутив под названием Elementary OS, основанный на Ubuntu. При запуске моего приложения я обнаружил, что оно отображалось без оформления окна (например, строка заголовка, кнопка закрытия и т. Д. c.). Таким образом, чтобы исправить эту проблему, я следовал инструкциям использовать GTK 2 вместо GTK 3 в этом ответе .

Возможно ли, что это вызывает проблему?

Сводка

В итоге я пытаюсь создать диалоговое окно подтверждения модальное . Обычно код, который я использую, должен работать, но по какой-то причине это не так. Любая помощь будет принята с благодарностью!

...