Я работаю над программой, в которой я изучаю масштабирование и перемещение объектов в 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 любого объекта, если масштаб группы не задан по умолчанию?