2

我正在开发一个程序,在该程序中我正在学习如何在 JavaFX 中缩放和移动对象。对于我正在使用的程序GroupGroup我有两个Rectangle,我有一些Sliders可以更改两者的属性Rectangle

发生的问题是,当我在程序中更改translateXortranslateYRectangle,保持父级的ScaleXand不是 1,它也会更改另一个的位置,但是当比例为 1 时,不会发生此问题。ScaleYGroupRectangle

这是我的程序:

在我的程序中,我有两个Rectagle被调用a的 andb我正在使用Slider被调用的aTranslateX&aTranslateYbTranslateX&bTranslateY来分别更改 Rectaglesa和的 translateX 和 translateY b。而且我正在使用另一个Slider名为scale更改scaleX&scaleY的 Group 名为group包含aand b。同样,当我更改矩形的平移属性ab保持比例(scaleX& scaleYgroup但当我更改它们的(矩形ab)平移属性保持比例,而不是一个矩形的一个变化的平移属性也会改变另一个矩形在相反方向的变化位置。

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();
    }
    
}

当组的比例不是默认值时,如何解决此问题或更改任何对象的翻译属性的正确方法是什么?

4

1 回答 1

2

Group在计算它的大小时包括孩子的变换。由于通过scaleX/scaleY属性进行缩放的轴心点是节点的中心,因此更改平移属性可能会导致轴心点的位置发生变化,从而导致该组的所有子节点移动。如果您不希望这样做,请使用 a Pane(在大小计算中不包括变换)而不是Group使用作为枢轴点的Scale变换而不是/属性:(0,0)scaleXscaleY

Scale groupScale = new Scale();
group.getTransforms().add(groupScale);
groupScale.xProperty().bind(scale.valueProperty());
groupScale.yProperty().bind(scale.valueProperty());
于 2019-01-24T11:54:43.090 回答