Search code examples
javajavafxgridpanel

Redundant cell in GridPane JavaFx


I'm new in JavaFX, I would like to create a Grid example with some columns and rows. The grid as below: - first row: the first cell (width = 100) occupies 1 column and the second cell (width = 200) occupies 2 column - second row: the first (width = 200) cell occupies 2 column and the second cell (width = 100) occupies 1 column

But I don't know why there is a unexpected cell appears. As below image:

enter image description here

My code as below:

     // Label 1
     Label lbl1 = new Label("Label1");
     lbl1.setPrefWidth(100);
     lbl1.setStyle("-fx-border-style: solid; -fx-background-color: #80aaff; -fx-border-width: 0.25");
     // Label 2
     Label lbl2 = new Label("Label2");
     lbl2.setStyle("-fx-border-style: solid; -fx-background-color:#ff80bf; -fx-border-width: 0.25");
     lbl2.setPrefWidth(200);
     // Label 3
     Label lbl3 = new Label("Label3");
     lbl3.setPrefWidth(200);
     lbl3.setStyle("-fx-border-style: solid; -fx-background-color:#66ff99; -fx-border-width: 0.25");
     // Label 4
     Label lbl4 = new Label("Label4");
     lbl4.setPrefWidth(100);
     lbl4.setStyle("-fx-border-style: solid; -fx-background-color: #ffff66; -fx-border-width: 0.25");

     GridPane gridPane = new GridPane();
     gridPane.setStyle("-fx-border-style: solid");

     // column 0, row 0, column span 1, row span 1
     gridPane.add(lbl1, 0, 0, 1, 1);
     // column 1, row 0, column span 2, row span 1
     gridPane.add(lbl2, 1, 0, 2, 1);
     // column 0, row 1, column span 1, row span 1
     gridPane.add(lbl3, 0, 1, 2, 1);
     // column 2, row 1, column span 2, row span 1
     gridPane.add(lbl4, 2, 1, 1, 1);

Can anyone point out my problem? Thank you.


Solution

  • The calculation of the prefered width for the GridPane with column spans/overlapping columns often doesn't work quite as expected. The "cell" you see is the background of the GridPane not covered by any child.

    To avoid the GridPane from becoming too large, set the column widths via ColumnConstraints:

    // Label 1
    Label lbl1 = new Label("Label1");
    lbl1.setMaxWidth(Double.MAX_VALUE);
    lbl1.setStyle("-fx-border-style: solid; -fx-background-color: #80aaff; -fx-border-width: 0.25");
    // Label 2
    Label lbl2 = new Label("Label2");
    lbl2.setStyle("-fx-border-style: solid; -fx-background-color:#ff80bf; -fx-border-width: 0.25");
    lbl2.setMaxWidth(Double.MAX_VALUE);
    // Label 3
    Label lbl3 = new Label("Label3");
    lbl3.setMaxWidth(Double.MAX_VALUE);
    lbl3.setStyle("-fx-border-style: solid; -fx-background-color:#66ff99; -fx-border-width: 0.25");
    // Label 4
    Label lbl4 = new Label("Label4");
    lbl4.setMaxWidth(Double.MAX_VALUE);
    lbl4.setStyle("-fx-border-style: solid; -fx-background-color: #ffff66; -fx-border-width: 0.25");
    
    GridPane gridPane = new GridPane();
    
    ColumnConstraints constraints = new ColumnConstraints(100);
    gridPane.getColumnConstraints().addAll(constraints, constraints, constraints);
    
    gridPane.setStyle("-fx-border-style: solid");
    
    // column 0, row 0, column span 1, row span 1
    gridPane.add(lbl1, 0, 0);
    // column 1, row 0, column span 2, row span 1
    gridPane.add(lbl2, 1, 0, 2, 1);
    // column 0, row 1, column span 1, row span 1
    gridPane.add(lbl3, 0, 1, 2, 1);
    // column 2, row 1, column span 2, row span 1
    gridPane.add(lbl4, 2, 1);
    

    This doesn't prevent the empty "space" from reappearing when the window is resized though. To use the same size for all columns regardless of the width of the GridPane use percentWidth:

    ColumnConstraints constraints = new ColumnConstraints();
    constraints.setPercentWidth(100d/3d);
    gridPane.setPrefWidth(300);