有人能告诉我为什么这个动画只执行一次吗?(Javafx)

有人能告诉我为什么这个动画只执行一次吗?(Javafx),java,javafx,Java,Javafx,我遇到了一个问题,eH只被执行一次,我不确定是什么错了。我阅读了时间轴上的javadocs,我看不出哪里出了问题。希望有一双额外的眼睛可以看到什么是错误的。谢谢 import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHand

我遇到了一个问题,eH只被执行一次,我不确定是什么错了。我阅读了时间轴上的javadocs,我看不出哪里出了问题。希望有一双额外的眼睛可以看到什么是错误的。谢谢

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Demo extends Application {
    GridPane gp = new GridPane();
    Label label1 = new Label("Label 1");
    Label label2 = new Label("Label 2");
    Label label3 = new Label("Label 3");
    Label label4 = new Label("Label 4");
    Scene scene;
    VBox vbox = new VBox();
    VBox vbox2 = new VBox();
    Image image = new Image("image.png");
    ImageView iv = new ImageView();
    Rectangle first = new Rectangle(0, 0, 50, 50);
    Rectangle second = new Rectangle(0, 0, 50, 50);
    Rectangle third = new Rectangle(0, 0, 50, 50);
    Rectangle forth = new Rectangle(0, 0, 50, 50);
    Button b1 = new Button("Enter1");

    public void start(Stage primaryStage) {
        vbox.setSpacing(10);
        vbox.getChildren().addAll(label1, label2, label3, label4);
        gp.add(vbox, 0, 0);
        vbox2.getChildren().addAll(b1,new Button("Enter2"),
                new Button("Enter3"),new Button("Enter4"),new Button("Enter5") );
        gp.add(vbox2, 1, 0);
        iv.setImage(image);
        //iv.setFitWidth(700);
        //iv.setFitHeight(300);
        iv.setPreserveRatio(true);
        iv.setSmooth(true);
        iv.setCache(true);
        gp.add(iv, 3, 0);


        first.setFill(Color.BLACK);
        second.setFill(Color.WHITE);
        third.setFill(Color.WHITE);
        forth.setFill(Color.BLACK);
        gp.add(first, 4, 0);
        gp.add(second, 5, 0);
        gp.add(third, 4, 1);
        gp.add(forth, 5, 1);
        boolean x = false;
        EventHandler<ActionEvent> eH = e -> {
             if (x == false) {
                first.setFill(Color.WHITE);
                second.setFill(Color.BLACK);
                third.setFill(Color.BLACK);
                forth.setFill(Color.WHITE);
             }
             else {
                first.setFill(Color.BLACK);
                second.setFill(Color.WHITE);
                third.setFill(Color.WHITE);
                forth.setFill(Color.BLACK);
             }
             };


        Timeline animation = new Timeline(new KeyFrame(Duration.millis(500), eH));
         animation.setCycleCount(Timeline.INDEFINITE);
         animation.play();

         b1.setOnAction(new EventHandler<ActionEvent>() {
                public void handle(ActionEvent event) {
                    animation.stop();
                    animation.play();
                }
            });

        scene = new Scene(gp, 700, 300);
        primaryStage.setTitle("Lab 24");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
导入javafx.animation.KeyFrame;
导入javafx.animation.Timeline;
导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.Label;
导入javafx.scene.image.image;
导入javafx.scene.image.ImageView;
导入javafx.scene.layout.GridPane;
导入javafx.scene.layout.VBox;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Rectangle;
导入javafx.stage.stage;
导入javafx.util.Duration;
公共类演示扩展了应用程序{
GridPane gp=新的GridPane();
标签1=新标签(“标签1”);
标签2=新标签(“标签2”);
标签标签3=新标签(“标签3”);
标签4=新标签(“标签4”);
场景;
VBox VBox=新的VBox();
VBox vbox2=新的VBox();
图像=新图像(“Image.png”);
ImageView iv=新的ImageView();
矩形优先=新矩形(0,0,50,50);
第二个矩形=新矩形(0,0,50,50);
第三个矩形=新矩形(0,0,50,50);
forth矩形=新矩形(0,0,50,50);
按钮b1=新按钮(“输入1”);
公共无效开始(阶段primaryStage){
vbox.setspace(10);
vbox.getChildren().addAll(label1、label2、label3、label4);
加总成(vbox,0,0);
vbox2.getChildren().addAll(b1,新按钮(“输入2”),
新按钮(“输入3”)、新按钮(“输入4”)、新按钮(“输入5”);
加总成(vbox2,1,0);
iv.设置图像(图像);
//iv.设置宽度(700);
//iv.安装高度(300);
iv.真实比率(真);
iv.setSmooth(真实);
iv.setCache(真);
普通股增加(iv,3,0);
首先,设置填充(颜色为黑色);
第二,设置填充(颜色为白色);
第三,设置填充(颜色为白色);
第四,设置填充(颜色:黑色);
加总成(第一,4,0);
加总成(第二,5,0);
普通股增加(第三、四、一);
普通股增加(第四、五、一);
布尔x=假;
EventHandler eH=e->{
如果(x==false){
首先,设置填充(颜色为白色);
第二,设置填充(颜色为黑色);
第三,设置填充(颜色为黑色);
第四,设置填充(颜色为白色);
}
否则{
首先,设置填充(颜色为黑色);
第二,设置填充(颜色为白色);
第三,设置填充(颜色为白色);
第四,设置填充(颜色:黑色);
}
};
时间线动画=新时间线(新关键帧(持续时间.millis(500),eH));
animation.setCycleCount(Timeline.unfinite);
动画。播放();
b1.setOnAction(新的EventHandler(){
公共无效句柄(ActionEvent事件){
动画。停止();
动画。播放();
}
});
场景=新场景(gp,700300);
初级阶段。设置标题(“实验24”);
初级阶段。场景(场景);
primaryStage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}

动画一直在播放。。。但它什么也没做。第一次
x=false
执行一些更改,但是
x
始终为false,并且没有任何更改

例如,如果要创建前后不定效果,请执行以下操作:

boolean x = false;

@Override
public void start(Stage primaryStage) {
    ...
    EventHandler<ActionEvent> eH = e -> {
         if (x == false) {
            first.setFill(Color.WHITE);
            second.setFill(Color.BLACK);
            third.setFill(Color.BLACK);
            forth.setFill(Color.WHITE);
            x=true;
         }
         else {
            first.setFill(Color.BLACK);
            second.setFill(Color.WHITE);
            third.setFill(Color.WHITE);
            forth.setFill(Color.BLACK);
            x=false;
         }
    };

    Timeline animation = new Timeline(new KeyFrame(Duration.millis(500), eH));
    animation.setCycleCount(Timeline.INDEFINITE);
    animation.play();
boolean x=false;
@凌驾
公共无效开始(阶段primaryStage){
...
EventHandler eH=e->{
如果(x==false){
首先,设置填充(颜色为白色);
第二,设置填充(颜色为黑色);
第三,设置填充(颜色为黑色);
第四,设置填充(颜色为白色);
x=真;
}
否则{
首先,设置填充(颜色为黑色);
第二,设置填充(颜色为白色);
第三,设置填充(颜色为白色);
第四,设置填充(颜色:黑色);
x=假;
}
};
时间线动画=新时间线(新关键帧(持续时间.millis(500),eH));
animation.setCycleCount(Timeline.unfinite);
动画。播放();

或者,如果只需要一个周期,请删除
animation.setCycleCount(Timeline.unfinite)
,每次单击按钮时,您将得到一个周期。事件处理程序
b1

会多次执行,后续执行时,它将无需执行任何操作,因为它始终在相同的矩形上设置相同的填充。要显示它正在执行,请放置语句
System.out.print(“*”)
在事件处理程序中,您将看到控制台每隔半秒打印一个
*
符号。