Class FlowPane

java.lang.Object
All Implemented Interfaces:
Styleable, EventTarget

public class FlowPane extends Pane
FlowPane lays out its children in a flow that wraps at the flowpane's boundary.

A horizontal flowpane (the default) will layout nodes in rows, wrapping at the flowpane's width. A vertical flowpane lays out nodes in columns, wrapping at the flowpane's height. If the flowpane has a border and/or padding set, the content will be flowed within those insets.

FlowPane's prefWrapLength property establishes its preferred width (for horizontal) or preferred height (for vertical). Applications should set prefWrapLength if the default value (400) doesn't suffice. Note that prefWrapLength is used only for calculating the preferred size and may not reflect the actual wrapping dimension, which tracks the actual size of the flowpane.

The alignment property controls how the rows and columns are aligned within the bounds of the flowpane and defaults to Pos.TOP_LEFT. It is also possible to control the alignment of nodes within the rows and columns by setting rowValignment for horizontal or columnHalignment for vertical.

Example of a horizontal flowpane:


     Image images[] = { ... };
     FlowPane flow = new FlowPane();
     flow.setVgap(8);
     flow.setHgap(4);
     flow.setPrefWrapLength(300); // preferred width = 300
     for (int i = 0; i < images.length; i++) {
         flow.getChildren().add(new ImageView(image[i]);
     }
 

Example of a vertical flowpane:


     FlowPane flow = new FlowPane(Orientation.VERTICAL);
     flow.setColumnHalignment(HPos.LEFT); // align labels on left
     flow.setPrefWrapLength(200); // preferred height = 200
     for (int i = 0; i < titles.size(); i++) {
         flow.getChildren().add(new Label(titles[i]);
     }
 

FlowPane lays out each managed child regardless of the child's visible property value; unmanaged children are ignored for all layout calculations.

FlowPane may be styled with backgrounds and borders using CSS. See Region superclass for details.

Resizable Range

A flowpane's parent will resize the flowpane within the flowpane's resizable range during layout. By default the flowpane computes this range based on its content as outlined in the tables below.

Horizontal
widthheight
minimum left/right insets plus largest of children's pref widths top/bottom insets plus height required to display all children at their preferred heights when wrapped at a specified width
preferred left/right insets plus prefWrapLength top/bottom insets plus height required to display all children at their pref heights when wrapped at a specified width
maximum Double.MAX_VALUEDouble.MAX_VALUE

Vertical
widthheight
minimum left/right insets plus width required to display all children at their preferred widths when wrapped at a specified height top/bottom insets plus largest of children's pref heights
preferred left/right insets plus width required to display all children at their pref widths when wrapped at the specified height top/bottom insets plus prefWrapLength
maximum Double.MAX_VALUEDouble.MAX_VALUE

A flowpane's unbounded maximum width and height are an indication to the parent that it may be resized beyond its preferred size to fill whatever space is assigned to it.

FlowPane provides properties for setting the size range directly. These properties default to the sentinel value Region.USE_COMPUTED_SIZE, however the application may set them to other values as needed:


     flowPane.setMaxWidth(500);
 
Applications may restore the computed values by setting these properties back to Region.USE_COMPUTED_SIZE.

FlowPane does not clip its content by default, so it is possible that children's bounds may extend outside its own bounds if a child's pref size is larger than the space flowpane has to allocate for it.

Since:
JavaFX 2.0