Java 在动画或布局处理期间,不允许从时间轴中的showAndWait()获取警报的按钮类型:showAndWait

Java 在动画或布局处理期间,不允许从时间轴中的showAndWait()获取警报的按钮类型:showAndWait,java,animation,javafx,controller,Java,Animation,Javafx,Controller,我在JavaFX中有一个警报。信息,带有自定义的“是”和“否”按钮。在JavaFX时间线中,当达到某个条件时,我希望使用showAndWait()显示此警报,然后获取用户单击以关闭警报的内容(“是”或“否”) 这是我到目前为止所拥有的 package application; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; import

我在JavaFX中有一个
警报。信息
,带有自定义的“是”和“否”按钮。在JavaFX
时间线中,当达到某个条件时,我希望使用
showAndWait()
显示此警报,然后获取用户单击以关闭警报的内容(“是”或“否”)

这是我到目前为止所拥有的

package application;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Main extends Application {
    String drawingsSelected = "something here";
    ButtonType yesButton = new ButtonType("Yes");
    ButtonType noButton = new ButtonType("No");
    
    Alert commenceAlert;

    @Override
    public void start(Stage primaryStage) {
        
        commenceAlert = new Alert(AlertType.INFORMATION);
        commenceAlert.setHeaderText("Warning");
        commenceAlert.getButtonTypes().setAll(yesButton, noButton);
        
        Button myButton = new Button("click");
        myButton.setOnAction(e->quickPick());
        
        VBox root = new VBox(5);
        root.getChildren().add(myButton);
        Scene myScene = new Scene(root);
        primaryStage.setScene(myScene);
        primaryStage.show();
    }
    

    //randomly select the rest of the card numbers
    private void quickPick() {
        List<Integer> randomNumbers = new ArrayList<Integer>(Arrays.asList(1,2,3,4));
        int spotsLeft = randomNumbers.size();
        //add randomNumbers on a time-line
        Timeline timeline = new Timeline(new KeyFrame(
                Duration.millis(100),
                
                e -> {
                    setCardNumbers(randomNumbers.remove(0));
                }
                ));
        timeline.setCycleCount(spotsLeft);
        timeline.play();
        
    }

    //add i to the card
    //at the last addition, call commenceDrawings()
    private void setCardNumbers(int i) {
        System.out.println("adding "+i);
        if(i==4) {
            commenceDrawings();
        }
    }

    //called when the conditions are met to start the drawings
    public void commenceDrawings() {
        commenceAlert.setContentText(drawingsSelected);
        
        Optional<ButtonType> result = commenceAlert.showAndWait();
        
        //player selected "YES"
        if(result.get() == yesButton) {
            System.out.println("you clicked yes");
        }
        else //player selected "NO"
        {
            System.out.println("you clicked no");
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}
编辑1:暂停时间线会出现以下错误:

The local variable timeline may not have been initialized
编辑2: 我认为它可以正确地编辑setCardNumbers():


请……对不起,@kleopatra。我已经添加了它。谢谢:)是的,明白你的意思了(错误告诉我们到底出了什么问题)-如果你期望用户的输入,为什么要让时间线继续运行?setCardNumbers()不只是停止或暂停,而是在添加数字后检查这些条件。如果所有条件都已通过,则会调用CommentedDrawings(),即出错函数。如果在添加最后一个数字之前停止时间线,则不会添加最后一个数字。在之后停止它仍将生成错误(因为添加调用CommentedRawings()的最后一个数字时,我们仍在时间线中)。那么,你建议我做什么呢?加强你的例子来演示约束(请仔细阅读我的评论,停止不是唯一的选择;)请..对不起,@kleopatra。我已经添加了它。谢谢:)是的,明白你的意思了(错误告诉我们到底出了什么问题)-如果你期望用户的输入,为什么要让时间线继续运行?setCardNumbers()不只是停止或暂停,而是在添加数字后检查这些条件。如果所有条件都已通过,则会调用CommentedDrawings(),即出错函数。如果在添加最后一个数字之前停止时间线,则不会添加最后一个数字。在之后停止它仍将生成错误(因为添加调用CommentedRawings()的最后一个数字时,我们仍在时间线中)。那么,你建议我做什么呢?增强你的示例以演示约束(请仔细阅读我的评论,停止不是唯一的选择;)
The local variable timeline may not have been initialized
//add randomNumbers on a time-line
            Timeline timeline = new Timeline(new KeyFrame(
                    Duration.millis(300),
                    
                    e -> {
                        timeline.pause();
                        setCardNumbers(randomNumbers.remove(0));
                        timeline.play();
                    }
                    ));
    //add i to the card
    //at the last addition, call commenceDrawings()
    private void setCardNumbers(int i) {
        System.out.println("adding "+i);
        if(i==4) {
            Platform.runLater(()-> {
                gui.commenceDrawings();
            });
        }
    }