вращать (вращать) узел вокруг другого объекта (javafx-2) - PullRequest
1 голос
/ 28 марта 2012

У меня проблемы с созданием простой анимации типа Солнце / Земля.
В следующем примере круг должен вращаться вокруг прямоугольника.
Для этого я создаю новую группу, прикрепите прямоугольник со смещением0 и круг со смещением 50.
Теперь, когда группа вращается, я думал, что прямоугольник должен вращаться вокруг себя, и круг должен вращаться вокруг прямоугольника.

Но кажется, что обе фигуры имеютсмещение и вращение вокруг невидимого центра.

import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        // create root node
        Group root = new Group();
        Scene scene = new Scene(root, 640, 400);
        primaryStage.setScene(scene);

        // translate root node to center of the screen
        root.setTranslateX(320);
        root.setTranslateY(200);

        // create scene
        createScene(root);

        primaryStage.show();
    }

    private void createScene(Group root) {
        Group branch = new Group();
        root.getChildren().add(branch);

        // create a recangle, which will be added to the branch
        Rectangle r = new Rectangle(40, 20);
        branch.getChildren().add(r);

        // circle should orbit around the rectangle
        Circle c = new Circle(10);
        branch.getChildren().add(c);
        c.setTranslateY(-50);

        // rotate the branch
        Timeline rot = new Timeline();
        rot.setCycleCount(Timeline.INDEFINITE);
        rot.setRate(1);
        rot.getKeyFrames().addAll(
                new KeyFrame(Duration.ZERO, new KeyValue(
                        branch.rotateProperty(), 0)),
                new KeyFrame(Duration.seconds(5), new KeyValue(branch
                        .rotateProperty(), 360)));
        rot.playFromStart();

    }

    public static void main(String[] args) {
        launch(args);
    }
}

1 Ответ

3 голосов
/ 28 марта 2012

Обратите внимание, что вращение любого объекта происходит вокруг его центра.Самый простой способ исправить ваши проблемы - использовать StackPane вместо Group.По умолчанию StackPane помещает все объекты в его центр.

private void createScene(Group root) {
    Pane branch = new StackPane();
    root.getChildren().add(branch);
...