Java 在动画或布局处理期间,不允许从时间轴中的showAndWait()获取警报的按钮类型:showAndWait
我在JavaFX中有一个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时间线中,当达到某个条件时,我希望使用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();
});
}
}