Подтвердить что ты не робот

Когда использовать перевод и при переезде - В чем разница между переводами и координатами компоновки?

Когда использовать перевод и переместить, чтобы переместить node? В конце дня кажется, что они делают то же самое (визуально); переместите node; первый, выполнив перевод по происхождению (x, y остается тем же), второй - изменением x, y-коордов. Поэтому предположим, что я хочу переместить node в определенную точку на экране. Должен ли я использовать node.relocate(x, y) или node.setTranslateX(x), node.setTranslateY(y)

Чтобы продемонстрировать, что я имею в виду, я создал образец программы, с которой вы можете играть: Прямоугольник на экране, положение которого определяется четырьмя ползунками (2 из них управляют макетом x, y другие два управляют переводом x, y).

/* imports are missing */  
public class TransReloc extends Application{
    @Override
    public void start(Stage primaryStage) throws Exception {
        Group root = new Group();
        Rectangle rect = new Rectangle(100, 50, Color.BLUE);
        root.getChildren().add(rect);
        VBox controlGroup = new VBox();
        Slider relocX = new Slider(-100, 100, 0 );
        Slider relocY = new Slider(-100, 100, 0 );
        Slider transX = new Slider(-100, 100, 0 );
        Slider transY = new Slider(-100, 100, 0 );
        rect.layoutXProperty().bind(relocX.valueProperty());
        rect.layoutYProperty().bind(relocY.valueProperty());
        rect.translateXProperty().bind(transX.valueProperty());
        rect.translateYProperty().bind(transY.valueProperty());
        controlGroup.getChildren().addAll(relocX, relocY, transX, transY);
        root.getChildren().add(controlGroup);
        controlGroup.relocate(0, 300);
        Scene scene  = new Scene(root, 300, 400, Color.ALICEBLUE);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}
4b9b3361

Ответ 1

Координаты

layout используются Менеджерами макетов, такими как StackPane или VBox, для управления местоположением своих детей. Группа (и панель) оставляет детскую компоновку разработчику, поэтому нет никакой разницы в функциональности translate.

Итак, вы должны изменить только координаты translate для точной настройки местоположения и оставить layout менеджерам макетов (на самом деле вы не можете изменить layoutX, layoutY для узлов внутри менеджеров компоновки не Group/Pane)

В качестве примера попробуйте запустить следующий код и изменить размер окна, чтобы увидеть, как StackPane пересчитывает layoutBounds

public void start(Stage primaryStage) throws Exception {
    StackPane root = new StackPane();
    Rectangle rect = new Rectangle(100, 50, Color.BLUE);
    root.getChildren().add(rect);
    Scene scene  = new Scene(root, 300, 300, Color.ALICEBLUE);

    rect.layoutXProperty().addListener( (e) -> {
        System.out.println(rect.getLayoutX() + ":" + rect.getLayoutY());
            });

    primaryStage.setScene(scene);
    primaryStage.show();

}

Ответ 2

Другое отличие состоит в том, что при вызове Node.getBoundsInLocal() вычисляются LayoutX, LayoutY и все примененные эффекты. Но Node.getBoundsInParent() будет рассчитываться с помощью LayoutX, LayoutY, всех примененных эффектов и всех преобразований (вращение, перемещение и масштабирование). Таким образом, вы можете использовать свойства LayoutX/Y в качестве основной позиции и использовать translateX/Y в качестве второго или альтернативного способа перемещения узла. А другое отличие обсуждалось выше, я имею в виду не копировать у Сергея Гринева.