何时使用平移和何时重新定位 - 平移坐标和布局坐标有什么区别?
When to use translate and when relocate - What is the difference between translate and layout coordinates?
何时使用 translate 以及何时使用 relocate 来移动节点?归根结底,他们似乎在做同样的事情(视觉上);移动节点;第一个是对原点进行平移(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);
}
}
layout
布局管理器(如 StackPane 或 VBox)使用坐标来控制其子项的位置。组(和窗格)将子布局留给开发人员,因此与 translate
功能没有区别。
所以通常你应该只更改 translate
坐标以进行精细位置调整并将 layout
留给布局管理器(实际上你不能更改非 Group/Pane 内节点的 layoutX,layoutY布局管理器)
作为示例尝试 运行 下一个代码并调整大小 window 以查看 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();
}
另一个区别是当你调用Node.getBoundsInLocal()时,会计算LayoutX、LayoutY和所有应用的Effects。但是,Node.getBoundsInParent() 将使用 LayoutX、LayoutY、所有应用的效果 加上所有转换(旋转、平移和缩放)进行计算.因此,您可以使用 LayoutX/Y 属性作为主要位置,并使用 translateX/Y 作为第二种或替代移动方式节点。另一个区别在上面已经讨论过了,我的意思是不要从 Sergey Grinev 那里复制。
何时使用 translate 以及何时使用 relocate 来移动节点?归根结底,他们似乎在做同样的事情(视觉上);移动节点;第一个是对原点进行平移(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);
}
}
layout
布局管理器(如 StackPane 或 VBox)使用坐标来控制其子项的位置。组(和窗格)将子布局留给开发人员,因此与 translate
功能没有区别。
所以通常你应该只更改 translate
坐标以进行精细位置调整并将 layout
留给布局管理器(实际上你不能更改非 Group/Pane 内节点的 layoutX,layoutY布局管理器)
作为示例尝试 运行 下一个代码并调整大小 window 以查看 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();
}
另一个区别是当你调用Node.getBoundsInLocal()时,会计算LayoutX、LayoutY和所有应用的Effects。但是,Node.getBoundsInParent() 将使用 LayoutX、LayoutY、所有应用的效果 加上所有转换(旋转、平移和缩放)进行计算.因此,您可以使用 LayoutX/Y 属性作为主要位置,并使用 translateX/Y 作为第二种或替代移动方式节点。另一个区别在上面已经讨论过了,我的意思是不要从 Sergey Grinev 那里复制。