有人能告诉我为什么这个动画只执行一次吗?(Javafx)
我遇到了一个问题,eH只被执行一次,我不确定是什么错了。我阅读了时间轴上的javadocs,我看不出哪里出了问题。希望有一双额外的眼睛可以看到什么是错误的。谢谢有人能告诉我为什么这个动画只执行一次吗?(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
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(“*”)
在事件处理程序中,您将看到控制台每隔半秒打印一个*
符号。