Search code examples
javalayoutjavafx-8gridpane

JavaFX GridPane - Configuring controls to grow and occupy all the available space


Trying to achieve:

  1. Text Field 1 and Text Field 3 should occupy all the available free space
  2. Button 1 and Button 2 should have same width

Issue:

Text Field 1 and Text Field 3 are NOT occupying all the available free space (though they are growing once Label is completely displayed)

Here is the screen shot:

GridPane - Controls are not occupying all the available space

// Removed imports for brevity

public class GridPaneTest extends Application
{
  @Override
  public void start(Stage primaryStage)
  {
    primaryStage.setTitle("GridPane Test");

    GridPane gridPane = new GridPane();
    // gridPane.setGridLinesVisible(true);
    gridPane.setHgap(5);
    gridPane.setVgap(5);
    gridPane.setPadding(new Insets(5));

    TextField tf1 = new TextField("Text Field 1");
    GridPane.setHgrow(tf1, Priority.ALWAYS);
    gridPane.add(tf1, 0, 0);
    TextField tf2 = new TextField("Text Field 2");
    GridPane.setHgrow(tf2, Priority.NEVER);
    gridPane.add(tf2, 1, 0);
    Button button1 = new Button("Button 1");
    button1.setMaxWidth(140);
    GridPane.setHgrow(button1, Priority.NEVER);
    GridPane.setHalignment(button1, HPos.RIGHT);
    gridPane.add(button1, 2, 0);

    TextField tf3 = new TextField("Text Field 3");
    GridPane.setHgrow(tf3, Priority.ALWAYS);
    gridPane.add(tf3, 0, 1, 2, 1);
    Button button2 = new Button("Button 2 Button 2");
    button2.setMaxWidth(140);
    GridPane.setHgrow(button2, Priority.NEVER);
    GridPane.setHalignment(button2, HPos.RIGHT);
    gridPane.add(button2, 2, 1);

    Label label1 = new Label(
        "Label 1 Label 1 Label 1 Label 1 Label 1 Label 1 Label 1 Label 1 Label 1 Label 1 Label 1");
    GridPane.setHgrow(label1, Priority.ALWAYS);
    gridPane.add(label1, 0, 2, 3, 1);

    primaryStage.setScene(new Scene(gridPane)); 

    primaryStage.show();
  }

  public static void main(String[] args)
  {
    launch(args);
  }
}

Solution

  • According to GridPane documentation

    if an application needs to explicitly control the size of rows or columns, it may do so by adding RowConstraints and ColumnConstraints objects to specify those metrics

    gridPane.getColumnConstraints()
      .addAll(new ColumnConstraints(), new ColumnConstraints(),
        new ColumnConstraints(140) /* Control the third column size */);
    

    Screen shot:

    GridPane - Demo configuring controls to grow and occupy all the available free space