【问题标题】:When to use translate and when relocate - What is the difference between translate and layout coordinates?何时使用翻译和何时重定位 - 翻译坐标和布局坐标有什么区别?
【发布时间】:2015-03-03 15:44:45
【问题描述】:

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


    【解决方案1】:

    layout 坐标被 StackPane 或 VBox 等布局管理器用来控制其子级位置。组(和窗格)将子布局留给开发人员,因此与 translate 功能没有区别。

    因此,通常您应该只更改 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();
    
    }
    

    【讨论】:

    • 因此,将形状放置在 Pane 上并允许用户拖动它们的绘图应用应该使用 setLayoutX/Y 或重定位,而不是 setTranslateX/Y?
    • @silvali,我会说反之亦然:)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-07
      • 2014-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      相关资源
      最近更新 更多