何时使用平移和何时重定位-平移和布局坐标之间有什么区别?

问题描述 投票:10回答:2

何时使用平移以及何时移动节点以移动节点?归根结底,他们似乎在视觉上做着同样的事情。移动节点;第一个通过对原点进行平移(x,y保持不变),第二个通过更改x,y坐标。因此,假设我想在屏幕的特定位置移动节点。.我应该使用node.relocate(x,y)还是node.setTranslateX(x),node.setTranslateY(y)?

为了演示我的意思,我制作了一个可以玩的示例程序:屏幕上的矩形,其位置由4个滑杆确定(其中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);
    }
}
javafx-2 javafx-8
2个回答
9
投票
因此,通常,您仅应更改translate坐标以进行精细的位置调整,并将layout留给布局管理器(实际上,对于非组/窗格布局管理器中的节点,您不能更改layoutX,layoutY)

作为示例,尝试运行下一个代码并调整大小窗口,以查看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(); }


0
投票
Node.getBoundsInLocal()时,将计算LayoutX,LayoutY和所有已应用的效果。但是,

Node.getBoundsInParent()将使用LayoutX,LayoutY,所有已应用的效果加上所有转换(旋转,平移和缩放)进行计算。因此,您可以使用LayoutX / Y属性作为主要位置,并使用translateX / Y作为第二种或另一种移动节点的方法。上面已经讨论了另一个区别,我的意思是不要从谢尔盖·吉里涅夫那里复制。

© www.soinside.com 2019 - 2024. All rights reserved.