何时使用翻译和重定位时 - 翻译和布局坐标有什么区别?

时间:2015-03-03 15:44:46

标签: javafx-2 javafx-8

何时使用翻译和重新定位以移动节点?在一天结束时,似乎他们做了同样的事情(视觉上);移动节点;第一个是通过对原点进行平移(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);
    }
}

2 个答案:

答案 0 :(得分:9)

布局管理器(如StackPane或VBox)使用

layout坐标来控制其子位置。 Group(和Pane)将子项布局留给开发人员,因此与translate功能没有区别。

因此,一般情况下,您只应更改translate坐标以进行精确位置调整,并将layout保留给布局管理器(实际上您无法更改布局X,非组/窗格布局管理器中的节点布局;) / p>

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

}

答案 1 :(得分:1)

另一个区别是,当您调用 Node.getBoundsInLocal()时,将计算LayoutX,LayoutY和所有应用的效果。但是, Node.getBoundsInParent()将通过LayoutX,LayoutY,所有应用的效果以及所有转换(旋转,平移和缩放)进行计算。因此,您可以使用 LayoutX / Y 属性作为主要位置,并使用 translateX / Y 作为第二种或另一种移动节点的方法。上面讨论了另一个区别,我的意思是不要从Sergey Grinev复制。