Pit*_*elk 10 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);
}
}
Run Code Online (Sandbox Code Playgroud)
layout布局管理器(如StackPane或VBox)使用坐标来控制其子位置.Group(和Pane)将子项布局留给开发人员,因此与translate功能没有区别.
所以通常你应该只改变translate精确位置调整的坐标并留给layout布局管理器(实际上你不能为非Group/Pane布局管理器中的节点更改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();
}
Run Code Online (Sandbox Code Playgroud)