javafx动画循环 在C++或C语言中,我们知道改变GoDyy(x,y)的连接,可以使用循环和睡眠来改变连线和制作动画。像这样, for(x = 20; x < 25; x++){ gotoxy(x,20); cout << "*" } (x=20;x

javafx动画循环 在C++或C语言中,我们知道改变GoDyy(x,y)的连接,可以使用循环和睡眠来改变连线和制作动画。像这样, for(x = 20; x < 25; x++){ gotoxy(x,20); cout << "*" } (x=20;x,java,javafx-2,javafx,Java,Javafx 2,Javafx,下面是一个关于使用的介绍。它是JavaFX和中动画的关键组件 用于确定动画的关键部分出现的时间和顺序 下面是一个使用 正如安迪在评论中所指出的那样,这本书中有许多例子 还有一个很可爱的例子 关键是你不需要休眠JavaFX应用程序线程,每次你更新某个东西并希望它被渲染时,你都必须将JavaFX线程的控制权释放回JavaFX系统。JavaFX动画类会为你处理这些事情,这样你就不必担心了。如果你像在示例中那样循环根据您的问题,JavaFX将在循环完成后渲染场景一次,您将永远不会看到任何事情发生 这是一

下面是一个关于使用的介绍。它是JavaFX和
中动画的关键组件 用于确定动画的关键部分出现的时间和顺序

下面是一个使用

正如安迪在评论中所指出的那样,这本书中有许多例子

还有一个很可爱的例子

关键是你不需要休眠JavaFX应用程序线程,每次你更新某个东西并希望它被渲染时,你都必须将JavaFX线程的控制权释放回JavaFX系统。JavaFX动画类会为你处理这些事情,这样你就不必担心了。如果你像在示例中那样循环根据您的问题,JavaFX将在循环完成后渲染场景一次,您将永远不会看到任何事情发生

这是一个相当无聊的例子,它用A来模拟你的问题中的C++代码,每400毫秒移动一个点一个像素。

import java.util.Date;
import javafx.animation.*;
import javafx.application.Application;
import javafx.event.*;
import javafx.scene.*;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.util.Duration;

/** Simple JavaFX Animation Sample. */
public class AnimationSample extends Application {
  private       int         x        = 20;
  private       String      status   = "";
  private final Circle      dot      = new Circle(20, 20, 3);
  private final TimeCounter counter  = new TimeCounter();

  public static void main(String[] args) throws Exception { launch(args); }
  @Override public void start(final Stage stage) throws Exception {
    final Timeline timeline = new Timeline(
      new KeyFrame(Duration.ZERO, new EventHandler() {
        @Override public void handle(Event event) {
          refreshScene();
        }
      }),  
      new KeyFrame(Duration.millis(400))
    );
    timeline.setCycleCount(Timeline.INDEFINITE);

    stage.setScene(new Scene(new Group(dot), 50, 50));
    stage.show();

    counter.reset();
    timeline.play();
  }

  private void refreshScene() {
    gotoxy(x, 20);

    status = "*****".equals(status) ? "*" : status + "*";
    System.out.println(String.format("%7d", counter.elapsed()) + " ms " + x + " " + status);

    if (x == 24) {
      x = 20;
    } else {
      x++;
    }
  }      

  private void gotoxy(int x, int y) {
    dot.setCenterX(x); 
    dot.setCenterY(y);
  }

  class TimeCounter {
    private long start = new Date().getTime();
    void reset()   { start = new Date().getTime(); }
    long elapsed() { return new Date().getTime() - start; }
  }
}
使用

正如安迪在评论中所指出的那样,这本书中有许多例子

还有一个很可爱的例子

关键是你不需要休眠JavaFX应用程序线程,每次你更新某个东西并希望它被渲染时,你都必须将JavaFX线程的控制权释放回JavaFX系统。JavaFX动画类会为你处理这些事情,这样你就不必担心了。如果你像在示例中那样循环根据您的问题,JavaFX将在循环完成后渲染场景一次,您将永远不会看到任何事情发生

这是一个相当无聊的例子,它用A来模拟你的问题中的C++代码,每400毫秒移动一个点一个像素。

import java.util.Date;
import javafx.animation.*;
import javafx.application.Application;
import javafx.event.*;
import javafx.scene.*;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.util.Duration;

/** Simple JavaFX Animation Sample. */
public class AnimationSample extends Application {
  private       int         x        = 20;
  private       String      status   = "";
  private final Circle      dot      = new Circle(20, 20, 3);
  private final TimeCounter counter  = new TimeCounter();

  public static void main(String[] args) throws Exception { launch(args); }
  @Override public void start(final Stage stage) throws Exception {
    final Timeline timeline = new Timeline(
      new KeyFrame(Duration.ZERO, new EventHandler() {
        @Override public void handle(Event event) {
          refreshScene();
        }
      }),  
      new KeyFrame(Duration.millis(400))
    );
    timeline.setCycleCount(Timeline.INDEFINITE);

    stage.setScene(new Scene(new Group(dot), 50, 50));
    stage.show();

    counter.reset();
    timeline.play();
  }

  private void refreshScene() {
    gotoxy(x, 20);

    status = "*****".equals(status) ? "*" : status + "*";
    System.out.println(String.format("%7d", counter.elapsed()) + " ms " + x + " " + status);

    if (x == 24) {
      x = 20;
    } else {
      x++;
    }
  }      

  private void gotoxy(int x, int y) {
    dot.setCenterX(x); 
    dot.setCenterY(y);
  }

  class TimeCounter {
    private long start = new Date().getTime();
    void reset()   { start = new Date().getTime(); }
    long elapsed() { return new Date().getTime() - start; }
  }
}

根据您的需要,JavaFX中有三种不同的选项

最基本的方法是。它相当于Swing的计时器。它只包含一个句柄方法,在每一帧上调用该方法,并将当前时间作为参数传递。您可能需要一些内部簿记,以便不必每次调用句柄时都进行昂贵的计算

有一个插值(frac)方法,使用介于0.0和1.0之间的frac值调用该方法。由您根据frac值执行所有想要的UI更改。过渡和时间线都扩展动画,因此您可以设置循环持续时间、过渡是否在结束时反转等内容


是最复杂的一个。您可以定义任意数量的关键帧(想想状态)包含不同节点的所需属性,时间轴将为您完成所有的工作,为您插值如何在提供的值之间设置更改的动画。例如,您可以在节点的x属性为0的情况下指定一个关键帧,在节点的x属性为100的情况下指定另一个关键帧,时间轴将为您设置动画。

有三个不同的选项在JavaFX中,根据您的需要

最基本的方法是。它相当于Swing的计时器。它只包含一个句柄方法,在每一帧上调用该方法,并将当前时间作为参数传递。您可能需要一些内部簿记,以便不必每次调用句柄时都进行昂贵的计算

有一个插值(frac)方法,使用介于0.0和1.0之间的frac值调用该方法。由您根据frac值执行所有想要的UI更改。过渡和时间线都扩展动画,因此您可以设置循环持续时间、过渡是否在结束时反转等内容


是最复杂的一个。您可以定义任意数量的关键帧(想想状态)包含不同节点的所需属性,时间轴将为您完成所有工作,为您插值如何在提供的值之间设置更改的动画。例如,您可以在节点的x属性为0的位置设置一个关键帧,在节点的x属性为100的位置设置另一个关键帧,时间轴将为您设置动画。

谷歌有答案,请查看Timeline类Google有答案,看看Timeline类这个问题是关于JavaFX的,Swing stuff在一个单独的线程和JavaFX中运行。所以除非你真的需要混合Swing和JavaFX,不要。问题是关于JavaFX,Swing stuff在一个单独的线程和JavaFX中运行。所以除非你真的需要混合Swing和JavaFX,不要T