Javafx动画在第一个周期后停止



我想要一个计数到3到3的计数器,然后它应该以0重新启动并重复计数至无限时间3。但是,当我的计数器达到3时,我的编程所做的最后一件事是设置文本"0"。我认为我没有正确使用动画。我希望有人知道我做错了什么。请注意,这只是我真正问题的简化;可能有更简单的方法来计算直到3 ...

import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline; 
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.text.Font;
import javafx.scene.text.FontPosture;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Duration;
public class GeneralTesting extends Application{
    private Text text;
    private int counter = 1;
    public static void main(String[] args) {
        launch();
    }
    @Override
    public void start(Stage primaryStage) throws Exception {
        Pane pane = new Pane();
        text = new Text(500, 300, "0");
        text.setFont(Font.font("Comic Sans MS", FontWeight.BOLD, FontPosture.REGULAR, 100));
        Animation animation = new Timeline(new KeyFrame(Duration.millis(1000), e -> {changeText(counter++);}));
        animation.setCycleCount(Timeline.INDEFINITE);
        animation.play();
        pane.getChildren().addAll(text);
        Scene scene = new Scene(pane);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public void changeText(int counter){
        if (counter > 5){
            counter = 0;
        }
        text.setText(String.valueOf(counter));
    }
}

in

if (counter > 5) {
    counter = 0 ;
}

您将 local 变量counter重置为0。实例字段保持其先前值。因此,在时间表的下一次迭代中,它仍然大于5,您将本地变量再次设置为零。

完全删除本地变量,只需更新字段:

import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline; 
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.text.Font;
import javafx.scene.text.FontPosture;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Duration;
public class GeneralTesting extends Application{
    private Text text;
    private int counter = 1;
    public static void main(String[] args) {
        launch();
    }
    @Override
    public void start(Stage primaryStage) throws Exception {
        Pane pane = new Pane();
        text = new Text(500, 300, "0");
        text.setFont(Font.font("Comic Sans MS", FontWeight.BOLD, FontPosture.REGULAR, 100));
        Animation animation = new Timeline(new KeyFrame(Duration.millis(1000), e -> {
            counter++; 
            changeText();
        }));
        animation.setCycleCount(Timeline.INDEFINITE);
        animation.play();
        pane.getChildren().addAll(text);
        Scene scene = new Scene(pane);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public void changeText(){
        if (counter > 5){
            counter = 0;
        }
        text.setText(String.valueOf(counter));
    }
}

最好还是使用IntegerProperty并将文本绑定到其值:

import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline; 
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.text.Font;
import javafx.scene.text.FontPosture;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Duration;
public class GeneralTesting extends Application{
    private Text text;
    public static void main(String[] args) {
        launch();
    }
    @Override
    public void start(Stage primaryStage) throws Exception {
        Pane pane = new Pane();
        text = new Text(500, 300, "0");
        text.setFont(Font.font("Comic Sans MS", FontWeight.BOLD, FontPosture.REGULAR, 100));
        IntegerProperty counter = new SimpleIntegerProperty(1);
        text.textProperty().bind(counter.asString());
        Animation animation = new Timeline(new KeyFrame(Duration.millis(1000), 
            e -> counter.set((counter.get()+1) % 5)));
        animation.setCycleCount(Timeline.INDEFINITE);
        animation.play();
        pane.getChildren().addAll(text);
        Scene scene = new Scene(pane);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

}

一种方法是使用mod保持0至3。

    Pane pane = new Pane();
    Text text = new Text(500, 300, "0");
    int[] counter =
    {
        0
    };
    text.setFont(Font.font("Comic Sans MS", FontWeight.BOLD, FontPosture.REGULAR, 100));
    Animation animation = new Timeline(new KeyFrame(Duration.millis(1000), e
            ->
    {
        text.setText(Integer.toString(counter[0]++ % 4));
    }));
    animation.setCycleCount(Timeline.INDEFINITE);
    animation.play();
    pane.getChildren().addAll(text);
    Scene scene = new Scene(pane);
    primaryStage.setScene(scene);
    primaryStage.show();

最新更新