Оповещения в Javafx не закрываются при нажатии кнопки «x» - PullRequest
0 голосов
/ 24 сентября 2018

Привет для другого приложения javafx. Я тестировал оповещения, и единственное, что не работает при нажатии кнопки «X» для окна оповещений.

Я добавил код ниже, но еслиу вас нет времени, чтобы запустить его здесь, это GIF, чтобы объяснить, что у меня есть проблема с предупреждением: https://giant.gfycat.com/GeneralUntimelyBluewhale.webm

Я не совсем уверен, как загрузить GIF-файлы на фактическое сообщение, так что извините за это.

Есть ли способ решить эту проблему?

Спасибо

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Playground extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        VBox root = new VBox(100);
        root.setPadding(new Insets(10));
        root.setAlignment(Pos.CENTER);

        Button button = new Button("Alert");
        button.setOnAction(event -> {
            ButtonType goodButton = new ButtonType("Good");
            ButtonType badButton = new ButtonType("Bad");
            Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "", goodButton, badButton);
            alert.showAndWait();

            if (alert.getResult().equals(goodButton)) {
                System.out.println("Good");
            } else if (alert.getResult().equals(badButton)) {
                System.out.println("Bad");
            }
        });

        // Add the buttons to the layout
        root.getChildren().addAll(button);

        // Show the Stage
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }
}

Ответы [ 2 ]

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

Чтобы добавить к ответ Саи Дандема , вот соответствующий javadoc от Dialog:

...

Правила закрытия диалога

Важно понимать, что происходит, когда диалог закрывается, а также как его можно закрыть, особенно в ситуациях ненормального закрытия (например, когда кнопка «X» нажата в строке заголовка диалога или во время работывводятся системные сочетания клавиш (например, alt-F4 в Windows).К счастью, в этих ситуациях результат четко определен, и его лучше всего суммировать в следующих пунктах:

  • Диалоги JavaFX могут быть закрыты «ненормально» (как определено выше) в двух ситуациях:
    1. Когда в диалоговом окне имеется только одна кнопка, или
    2. Когда в диалоговом окне имеется несколько кнопок, если одна из них удовлетворяет одному из следующих требований:
      1. Кнопка имеетa ButtonType , у которого ButtonBar.ButtonData имеет тип ButtonBar.ButtonData.CANCEL_CLOSE.
      2. Кнопка имеет ButtonType с ButtonBar.ButtonData возвращает значение true, когда ButtonBar.ButtonData.isCancelButton () вызван.
  • Во всех других ситуациях диалоговое окно будет отклоненоотвечать на все запросы на закрытие, оставаясь открытым до тех пор, пока пользователь не нажмет одну из доступных кнопок в области диалога DialogPane .
  • Если диалоговое окно закрыто ненормально, и если наборog содержит кнопку, соответствующую одному из двух указанных выше критериев. В диалоговом окне будет предпринята попытка установить для свойства result любое значение, возвращаемое при вызове преобразователя результатов с первым совпадением ButtonType .
  • Если по какой-либо причине преобразователь результатов возвращает значение NULL или если диалоговое окно закрывается, когда присутствует только одна кнопка без отмены, свойство result будет иметь значение NULL.и метод showAndWait () вернет Optional.empty () .Эта более поздняя точка означает, что, если вы используете либо опцию 2, либо опцию 3 (как представлено ранее в документации этого класса), Optional.ifPresent (java.util.function.Consumer) lambda никогда не будет вызываться, и код продолжит выполняться так, как если бы диалог вообще не возвращал никакого значения.

Обычно при использовании AlertType.CONFIRMATION уже есть кнопка отмены.Однако вы объявляете свои собственные кнопки в конструкторе Alert, который переопределяет кнопки по умолчанию.

Javadoc из Alert(AlertType,String,ButtonType...):

...

Передавая переменное число аргументов ButtonType, разработчик напрямую переопределяет кнопки по умолчанию, которые будут отображаться в диалоговом окне, заменяя предварительно определенные кнопки тем, что указано в массиве varargs.

...

И ни одна из ваших кнопок не является кнопкой отмены.Так как вы не указываете ButtonData, все они имеют ButtonBar.ButtonData.OTHER.

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

В соответствии с «Правилами закрытия диалога» в документации Dialog API , кнопка «X» по умолчанию работает нормально, только если хотя бы одна из кнопок имеет тип «ОТМЕНА».Таким образом, изменение любой из ваших кнопок на ButtonType.CANCEL должно закрывать ваше диалоговое окно при нажатии кнопки «X».

Если вы не заинтересованы в использовании встроенных кнопок, то вам нужно явно обработать запрос на закрытие диалогасогласно вашему требованию.

            ButtonType goodButton = new ButtonType("Good");
            ButtonType badButton = new ButtonType("Bad");
            Alert alert = new Alert(Alert.AlertType.ERROR,"",goodButton,badButton);
            Window window = alert.getDialogPane().getScene().getWindow();
            window.setOnCloseRequest(e -> alert.hide());
            Optional<ButtonType> result = alert.showAndWait();
            result.ifPresent(res->{
                if (res.equals(goodButton)) {
                    System.out.println("Good");
                } else if (res.equals(badButton)) {
                    System.out.println("Bad");
                }
            });
...