Почему изменение свойства перевода одного Shape в JavaFX Group влияет на другие Shapes после изменения Scale of Group - PullRequest
0 голосов
/ 24 января 2019

Я работаю над программой, в которой я изучаю масштабирование и перемещение объектов в JavaFX.Для моей программы я использую Group, а в Group у меня есть два Rectangle, и у меня есть Sliders для изменения свойств обоих Rectangle.

Проблема, которая возникла, заключается в том, что когда я изменяю translateX или translateY Rectangle в программе, оставляя ScaleX и ScaleY родительского Group отличным от 1, он такжеменяет положение другого Rectangle, но когда масштаб равен 1, эта проблема не возникает.

Вот моя программа:

В моей программе у меня есть два Rectagle, называемые aи b, и я использую Slider, называемый aTranslateX & aTranslateY и bTranslateX & bTranslateY, чтобы изменить translateX и translateY Rectagles a и b соответственно.И я использую другой Slider, называемый scale, чтобы изменить scaleX & scaleY группы под названием group, которая содержит a и b.Снова проблема не возникает, когда я изменяю свойства перевода прямоугольников a и b, сохраняя масштаб (scaleX & scaleY) group, но когда я изменяю их (прямоугольников a и * 1042)*) свойства translate с сохранением масштаба, отличного от одного изменяющегося свойства translate одного прямоугольника, также изменяет положение другого прямоугольника в противоположном направлении изменения.

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class Example extends Application{

    private Group group;

    public static void main(String... arguments){launch(arguments);}

    @Override public void start(Stage primaryStage){
        Rectangle a = new Rectangle(200, 200, Color.WHITE);
        Rectangle b = new Rectangle(200, 200, Color.SKYBLUE);
        a.setStroke(Color.BLACK);
        b.setStroke(Color.MAGENTA);
        group = new Group(a, b);

        Slider aTranslateX = new Slider(-1600, 1600, 20);
        Slider aTranslateY = new Slider(-1600, 1600, 20);
        Slider bTranslateX = new Slider(-1600, 1600, 20);
        Slider bTranslateY = new Slider(-1600, 1600, 20);
        Slider scale = new Slider(0, 12, 1);

        aTranslateX.valueProperty().addListener((o, l, c) -> {
            if(c != null) b.setTranslateX(c.doubleValue());
        });
        aTranslateY.valueProperty().addListener((o, l, c) -> {
            if(c != null) b.setTranslateY(c.doubleValue());
        });
        bTranslateX.valueProperty().addListener((o, l, c) -> {
            if(c != null) a.setTranslateX(c.doubleValue());
        });
        bTranslateY.valueProperty().addListener((o, l, c) -> {
            if(c != null) a.setTranslateY(c.doubleValue());
        });
        scale.valueProperty().addListener((o, l, c) -> {
            if(c != null){
                group.setScaleX(c.doubleValue());
                group.setScaleY(c.doubleValue());
            }
        });

        aTranslateX.setMinWidth(200);
        aTranslateY.setMinWidth(200);
        bTranslateX.setMinWidth(200);
        bTranslateY.setMinWidth(200);
        scale.setMinWidth(200);

        Label[] labels = new Label[5];
        for(int x = 0; x < labels.length; x++){
            labels[x] = new Label();
            labels[x].setMinWidth(150);
        }

        labels[0].setText("Rectangle A Translate X: ");
        labels[1].setText("Rectangle A Translate Y: ");
        labels[2].setText("Rectangle B Translate X: ");
        labels[3].setText("Rectangle B Translate Y: ");
        labels[4].setText("Scale of Group: ");

        VBox top = new VBox(10,
                            new HBox(8, labels[0], aTranslateX, labels[1], aTranslateY),
                            new HBox(8, labels[2], bTranslateX, labels[3], bTranslateY),
                            new HBox(8, labels[4], scale));

        top.setPadding(new Insets(12));
        top.setStyle("-fx-background-color: #fefefe");

        Pane pane = new Pane(group);

        BorderPane root = new BorderPane(pane);
        root.setTop(top);

        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.setWidth(1280);
        primaryStage.setHeight(700);
        primaryStage.show();
    }

}

Как решить эту проблему или как правильно изменить свойство translate любого объекта, если масштаб группы не задан по умолчанию?

1 Ответ

0 голосов
/ 24 января 2019

Group включает преобразования детей в расчете его размера. Поскольку точка поворота для масштабирования с помощью свойств scaleX / scaleY является центром узла, изменение свойств перевода может привести к изменению положения точки поворота, что приведет к перемещению всех дочерних элементов группы. Если вы не хотите этого, либо используйте Pane (не включая преобразования в расчете размера) вместо Group, либо используйте преобразование Scale с (0,0) в качестве точки разворота вместо scaleX / scaleY свойства:

Scale groupScale = new Scale();
group.getTransforms().add(groupScale);
groupScale.xProperty().bind(scale.valueProperty());
groupScale.yProperty().bind(scale.valueProperty());
...