JavaFx - 交互式排序应用程序

时间:2013-04-21 08:56:45

标签: java user-interface javafx-2 javafx

我正在开发一个交互式排序应用程序。我必须将数字表示为矩形,例如,当排序算法运行时,当交换两个数字时,必须交换矩形。我想用动画来做这件事。我该如何交换矩形?我目前正在使用转换测试这个,但我遇到了一些问题。我在一组中有两个矩形。当我尝试交换矩形时,两者都会在中间相遇并停止。这是代码:

    Rectangle r1 = rectangles.get(numbers[0]);
    Rectangle r2 = rectangles.get(numbers[1]);

    TranslateTransition translateTransition = new TranslateTransition();

    translateTransition.setNode(r1);
    translateTransition.setDuration(Duration.millis(1000));
    translateTransition.setFromX(r1.getX());
    translateTransition.setToX(r2.getX());

    TranslateTransition translateTransition2 = new TranslateTransition();

    translateTransition2.setNode(r2);
    translateTransition2.setDuration(Duration.millis(1000));
    translateTransition2.setFromX(r2.getX());
    translateTransition2.setToX(r1.getX());
    translateTransition2.play();

    translateTransition.play();

我需要一个类似于画布的窗格。我需要能够设置矩形坐标。

1 个答案:

答案 0 :(得分:2)

TranslateTransition适用于Node的translateX属性。因此,如果您使用setLayout定位矩形,relocate或只是构造函数参数TranslateTransition不适合您。

您需要开始使用translateX坐标或使用Timeline代替TranslateTransition

您可以在JavaDoc for layout

中详细了解布局和翻译

这是基于translateX的交换示例:

public void start(Stage primaryStage) {
    final Rectangle r1 = new Rectangle(50, 50, Color.RED);
    final Rectangle r2 = new Rectangle(50, 50, Color.BLUE);

    // note I use translate to position rectangles
    r1.setTranslateX(50);
    r2.setTranslateX(250);

    Button btn = new Button();
    btn.setText("Move it");
    btn.relocate(100, 100);
    btn.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            double x1 = r1.getTranslateX();
            double x2 = r2.getTranslateX();

            TranslateTransition translateTransition = new TranslateTransition();
            translateTransition.setNode(r1);
            translateTransition.setDuration(Duration.millis(1000));
            translateTransition.setToX(x2);

            TranslateTransition translateTransition2 = new TranslateTransition();
            translateTransition2.setNode(r2);
            translateTransition2.setDuration(Duration.millis(1000));
            translateTransition2.setToX(x1);

            translateTransition2.play();
            translateTransition.play();
        }
    });

    Pane root = new Pane();
    root.getChildren().addAll(btn, r1, r2);

    Scene scene = new Scene(root, 400, 350);

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();
}