Explicitly positioning nodes in JavaFX

Suggested approach

For your particular code snippet, perhaps using a Pane instead of a StackPane is the best approach.

Why your code doesn’t do what you want

If you are going to manually set layout values, don’t use a layout pane (such as a StackPane) which automatically sets layout values for you. If you use a layout pane, then the layout values you explicitly set will be overridden automatically the next time layout pane performs a layout pass (e.g. it is resized or some its content or location in the scene graph becomes dirty).

Options for explicitly laying out nodes

If you want to explicitly layout items in JavaFX do one of the following:

  1. Subclass Region and override layoutChildren.
  2. Place your content in a Pane if you need the container to be styled with CSS or implement resizing functions.
  3. Place your content in a Group if you don’t need the container to be styled with CSS or implement resizing functions.

Related advice on node positioning

If you want to have automatically laid out components using the predefined layout managers but you want to adjust or temporarily modify the locations of some of the components from their default positions, you can adjust the translateX/Y values rather than layoutX/Y values. According to the definition of translateX:

The node’s final translation will be computed as layoutX + translateX, where layoutX establishes the node’s stable position and translateX optionally makes dynamic adjustments to that position.
This variable can be used to alter the location of a node without disturbing its layoutBounds, which makes it useful for animating a node’s location.

This means that the layout manager can compute a child’s default position using layoutX, and you can adjust the position from the default using translateX.

Leave a Comment