Как использовать кнопку в Alert в Javafx без использования метода .stopAndWait? - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь создать игру в javafx, где, когда вы выигрываете, появляется предупреждение о том, что вы выиграли, и есть возможность снова сыграть или закрыть программу.Проблема состоит в том, чтобы использовать кнопку в окне предупреждения, вы должны использовать alert.stopAndWait (), который не работает с временными шкалами.

Есть ли другой способ управления кнопкой без этого метода или есть лучший способ кодировать это?

Спасибо заранее.

Редактировать: Вот код, который у меня есть для моего оповещения:

 public static void alert(Alert.AlertType alertType, Window owner, String title, String message) {
    Alert alert = new Alert(alertType);
    alert.setHeaderText(null);
    alert.setTitle(title);
    alert.setContentText(message);
    alert.initOwner(owner);
    alert.show();
    ButtonType buttonPlayAgain = new ButtonType("Play again");
    alert.getButtonTypes().setAll(buttonPlayAgain);
    alert.setOnHidden(evt -> Platform.exit());

    Optional<ButtonType> result = alert.showAndWait();
    if (result.get() == buttonPlayAgain){
        // ... user chose Play Again"
        System.out.println("play again");
    } else
        Platform.exit();
        // if user clicks exit

Проблема в том, что вы не можете использовать showAndWait с временной шкалой.Я пытаюсь найти альтернативу использованию showAndWait.

1 Ответ

0 голосов
/ 25 октября 2018

Вы можете использовать метод show(), но вам нужно будет получить результат после закрытия Alert, установив обработчик onCloseRequest().

Затем вы можете определить, какая кнопка была нажата с помощью метода alert.getResult().

Вот простая программа для демонстрации:

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 Main extends Application {

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

    @Override
    public void start(Stage primaryStage) {

        // Simple interface
        VBox root = new VBox(5);
        root.setPadding(new Insets(10));
        root.setAlignment(Pos.CENTER);

        // Button to show an alert
        Button btnShowAlert = new Button("Show Alert!");

        // Setup the button action
        btnShowAlert.setOnAction(event -> {

            // Create a simple Alert
            Alert alert = new Alert(Alert.AlertType.NONE);
            alert.setHeaderText(null);
            alert.setTitle("Just a title");
            alert.setContentText("A fun message");
//            alert.initOwner(owner); // Remove for this sample

            ButtonType buttonPlayAgain = new ButtonType("Play again");
            alert.getButtonTypes().setAll(buttonPlayAgain);
//            alert.setOnHidden(evt -> Platform.exit()); // Don't need this

            // Listen for the Alert to close and get the result
            alert.setOnCloseRequest(e -> {
                // Get the result
                ButtonType result = alert.getResult();
                if (result != null && result == buttonPlayAgain) {
                    System.out.println("Play Again!");
                } else {
                    System.out.println("Quit!");
                }
            });

            alert.show();

        });

        root.getChildren().add(btnShowAlert);

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