【问题标题】:JavaFX animation stops after first cycleJavaFX 动画在第一个周期后停止
【发布时间】:2017-03-14 20:04:39
【问题描述】:

我想要一个计数到 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));
    }

}

【问题讨论】:

    标签: java animation javafx


    【解决方案1】:

    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();
        }
    
    
    }
    

    【讨论】:

    • 局部变量的第一件事正是我要找的!非常感谢!
    【解决方案2】:

    一种方法是使用 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      相关资源
      最近更新 更多