Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javaFX中的转换重置位置_Java_Javafx_Transition - Fatal编程技术网

javaFX中的转换重置位置

javaFX中的转换重置位置,java,javafx,transition,Java,Javafx,Transition,我试图将一个圆从(100200)移动到(400200),一个循环后,圆应该从(100100)移动到(200100),并不断重复该运动。第一次循环后,我使用circle.setCenterX(100)和circle.setCenterY(100)重置圆的位置。但是,这不会反映在动画中。圆将重置为(400100),并在X方向上继续向前移动,而不是重复运动。我是javaFX新手。任何帮助都将不胜感激 import javafx.animation.*; import javafx.applicatio

我试图将一个圆从(100200)移动到(400200),一个循环后,圆应该从(100100)移动到(200100),并不断重复该运动。第一次循环后,我使用circle.setCenterX(100)和circle.setCenterY(100)重置圆的位置。但是,这不会反映在动画中。圆将重置为(400100),并在X方向上继续向前移动,而不是重复运动。我是javaFX新手。任何帮助都将不胜感激

import javafx.animation.*;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Test extends Application
{
  public static void main(String[] args)
  {
    launch(args);
  }

  final double lambda = 0.1; // pixel per millisecond
  double posX = 100;
  double posY = 200;
  double time = 0;
  double velocityX = 1*lambda;
  double velocityY = 0*lambda;
  Circle circle = new Circle(posX, posY, 20, Color.AQUA);
  Circle ref1 = new Circle(100, 200, 5, Color.CADETBLUE);
  Circle ref2 = new Circle(400, 200, 5, Color.CADETBLUE);
  Circle ref3 = new Circle(100, 100, 5, Color.CADETBLUE);

  @Override
  public void start(Stage stage) throws Exception
  {
    Pane pane = new Pane();
    pane.getChildren().addAll(circle, ref1, ref2, ref3);

    BorderPane root = new BorderPane();
    root.setCenter(pane);
    root.setStyle("-fx-background-color: #29353B");
    double WIDTH = 800;
    double HEIGHT = 600;
    Scene scene = new Scene(root, WIDTH, HEIGHT);
    stage.setScene(scene);
    stage.show();

    move(3000);
  }

  public void move(double dt) // dt in milliseconds
  {
    System.out.println(circle.getCenterX()+", "+circle.getCenterY());
    TranslateTransition translateTransition = new TranslateTransition(Duration.millis(dt), circle);
    //translateTransition.setInterpolator(Interpolator.LINEAR);
    translateTransition.setByX(this.velocityX*dt);
    translateTransition.setByY(this.velocityY*dt);
    translateTransition.setCycleCount(1);
    translateTransition.play();
    translateTransition.setOnFinished(actionEvent -> { updatePos(dt); move(2000); });
  }


  public void updatePos(double dt)
  {
    //this.posX += this.velocityX*dt;
    //this.posY += this.velocityY*dt;
    this.posX = 100;
    this.posY = 100;
    circle.setCenterX(this.posX);
    circle.setCenterY(this.posY);
  }
}

TranslateTransition
修改
translateX
translateY
属性,而不是
centerX
centerY
属性。如果在动画完成时修改了
centerX
centerY
属性,还应将
translateX
translateY
重置为0,以使圆显示在这些坐标处:

  public void updatePos(double dt) {
    //this.posX += this.velocityX*dt;
    //this.posY += this.velocityY*dt;
    this.posX = 100;
    this.posY = 100;
    circle.setCenterX(this.posX);
    circle.setCenterY(this.posY);
    circle.setTranslateX(0);
    circle.setTranslateY(0);
  }
或者,您可以使用
时间线
而不是
TranslateTransition
来直接操作动画中的
centerX
centerY
属性:

public void move(double dt) /* dt in milliseconds */ {
    System.out.println(circle.getCenterX() + ", " + circle.getCenterY());
    double targetX = circle.getCenterX() + this.velocityX * dt;
    double targetY = circle.getCenterY() + this.velocityY * dt;
    Timeline timeline = new Timeline(new KeyFrame(Duration.millis(dt),
            new KeyValue(circle.centerXProperty(), targetX),
            new KeyValue(circle.centerYProperty(), targetY)));

    timeline.setOnFinished(actionEvent -> {
        updatePos(dt);
        move(2000);
    });
    timeline.play();
}

public void updatePos(double dt) {
    this.posX = 100;
    this.posY = 100;
    circle.setCenterX(this.posX);
    circle.setCenterY(this.posY);
}

TranslateTransition
修改
translateX
translateY
属性,而不是
centerX
centerY
属性。如果在动画完成时修改了
centerX
centerY
属性,还应将
translateX
translateY
重置为0,以使圆显示在这些坐标处:

  public void updatePos(double dt) {
    //this.posX += this.velocityX*dt;
    //this.posY += this.velocityY*dt;
    this.posX = 100;
    this.posY = 100;
    circle.setCenterX(this.posX);
    circle.setCenterY(this.posY);
    circle.setTranslateX(0);
    circle.setTranslateY(0);
  }
或者,您可以使用
时间线
而不是
TranslateTransition
来直接操作动画中的
centerX
centerY
属性:

public void move(double dt) /* dt in milliseconds */ {
    System.out.println(circle.getCenterX() + ", " + circle.getCenterY());
    double targetX = circle.getCenterX() + this.velocityX * dt;
    double targetY = circle.getCenterY() + this.velocityY * dt;
    Timeline timeline = new Timeline(new KeyFrame(Duration.millis(dt),
            new KeyValue(circle.centerXProperty(), targetX),
            new KeyValue(circle.centerYProperty(), targetY)));

    timeline.setOnFinished(actionEvent -> {
        updatePos(dt);
        move(2000);
    });
    timeline.play();
}

public void updatePos(double dt) {
    this.posX = 100;
    this.posY = 100;
    circle.setCenterX(this.posX);
    circle.setCenterY(this.posY);
}