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

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

Я не совсем уверен, как загружать гифки в настоящий пост, поэтому извиняюсь за это.

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

Спасибо

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
bigfocalchord 24 Сен 2018 в 05:35

2 ответа

Лучший ответ

Согласно "Правилам закрытия диалогов" в В документации Dialog API кнопка «X» по умолчанию работает нормально, только если хотя бы одна из кнопок имеет тип «CANCEL». Поэтому изменение любой из ваших кнопок на 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");
                }
            });
4
Sai Dandem 24 Сен 2018 в 03:05

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

...

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

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

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

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

Документация Javadoc из Alert(AlertType,String,ButtonType...):

...

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

...

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

0
Slaw 24 Сен 2018 в 09:28