在JavaFX中明确定位节点

单击按钮后,它会更改其位置。

但是当我移动鼠标时,按钮又回到场景的中心,为什么呢?

我有以下代码:

public class HolaMundo extends Application {

Button btn;

Scene scene;

@Override

public void start(Stage primaryStage) {

btn = new Button();

btn.setText("Hola Mundo");

StackPane root = new StackPane();

root.getChildren().add(btn);

scene = new Scene(root, 300, 250);

primaryStage.setTitle("Hello World!");

primaryStage.setScene(scene);

primaryStage.show();

scene.setOnMouseMoved(new EventHandler<MouseEvent>(){

@Override

public void handle(MouseEvent t) {

btn.setText(String.valueOf(t.getX() ));

}

});

btn.setOnAction(new EventHandler<ActionEvent>() {

@Override

public void handle(ActionEvent event) {

btn.setLayoutX(Math.random() * (300 - btn.getWidth()));

btn.setLayoutY(Math.random() * (250 - btn.getHeight()));

}

});

}

public static void main(String[] args) {

launch(args);

}

}

回答:

对于您的特定代码段,也许使用Pane而不是StackPane是最好的方法。

如果要手动设置布局值,请不要使用会自动为您设置布局值的布局窗格(例如StackPane)。如果使用布局窗格,则下次布局窗格执行布局传递时(例如,调整其大小或场景图中某些内容或位置变脏),您显式设置的布局值将被自动覆盖。

如果要在JavaFX中显式布局项目,请执行以下一项操作:

  1. 子区域(Region)并重写layoutChildren。
  2. 如果需要使用CSS对容器进行样式设置或实现调整大小功能,请将内容放在窗格中。
  3. 如果您不需要使用CSS设置容器样式或实现调整大小功能,则可以将您的内容放在“ 组”中。

如果要使用预定义的布局管理器自动布局组件,但要从其默认位置调整或临时修改某些组件的位置,则可以调整translateX / Y值,而不是layoutX /

Y值。根据translateX的定义:

节点的最终平移将计算为layoutX +

translateX,其中layoutX建立节点的稳定位置,translateX可以选择对该位置进行动态调整。此变量可用于更改节点的位置,而不会影响其layoutBounds,这对于设置节点的位置动画效果非常有用。

这意味着布局管理器可以使用来计算子项的默认位置layoutX,而您可以使用来从默认位置调整位置translateX

以上是 在JavaFX中明确定位节点 的全部内容, 来源链接: utcz.com/qa/422870.html

回到顶部