1

在 c++ 或 c 编程语言中,我们知道改变坐标我们使用 gotoxy(x,y) 并且我们可以使用循环和睡眠来改变坐标并制作动画。像这样;

for(x = 20; x < 25; x++){
  gotoxy(x,20); cout << "*"
}

但我的问题是在 JAVAFX 2.0 编程中怎么样?我正在使用netbeans 7.2。感谢您的帮助。

4

3 回答 3

3

使用JavaFX 动画包

正如 Andy 在评论中指出的那样,JavaFX 动画教程中有很多示例。

还有一个跑马动画循环的可爱例子。

关键是您不会休眠 JavaFX 应用程序线程,并且每次更新某些内容并希望它呈现时,您必须将 JavaFX 线程的控制权释放回 JavaFX 系统。JavaFX 动画类会为您处理这些事情,因此您不必担心。如果您只是像在问题的示例代码中那样循环,JavaFX 只会在您的循环完成后渲染场景一次,您将永远看不到任何事情发生。

这是一个相当无聊的示例,它使用时间轴来模拟您问题中的 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; }
  }
}
于 2012-10-25T00:43:45.510 回答
2

JavaFX 中有三种不同的选项,具体取决于您的需要。

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

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

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

于 2013-03-30T18:15:21.150 回答
1

看看使用Timeline Animation。它是 JavaFX 中动画的关键组件,
用于确定动画的关键部分何时以及以何种顺序发生。

这是一个例子

于 2012-10-23T12:07:50.867 回答