ScrollPane 中的 JavaFX GridPane 比预期的要大

JavaFX GridPane in ScrollPane is bigger than expected

我在混javafx的时候遇到了这样的事情:
我创建了一个 GridPane,将其包裹在 ScrollPane 中并填充了 Buttons,但事先将 RowConstraintsColumnConstraints 更改为 GridPane

问题是水平滚动条看起来不合适。我相信它 GridPane 这么胖,但怎么会这样呢?


但是垂直滚动条非常好。

sample.fxml

<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="SampleController">
   <children>
      <ScrollPane AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <content>
            <GridPane fx:id="gridPane" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
              <columnConstraints>
                <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
              </columnConstraints>
            </GridPane>
         </content>
      </ScrollPane>
   </children>
</AnchorPane>

sampleController.java

public class SampleController {

    @FXML public GridPane gridPane;

    @FXML
    public void initialize(){
        RowConstraints rowConstraints = new RowConstraints(10.0, 40, 40);
        ColumnConstraints columnConstraints = new ColumnConstraints(10.0, 40, 40);
        int i=0,j=0;
        for(i=0; i<50; i++){
            gridPane.getRowConstraints().add(i, rowConstraints);
            for(j=0; j<30; j++) {
                gridPane.getColumnConstraints().add(j, columnConstraints);
                Button btn = new Button(Integer.toString(j+1));
                btn.setPrefSize(40, 40);
                gridPane.add(btn, j, i);
            }
        }
    }
}

Dashboard.java

public class sample extends Application{
    public static void main(String[] args){
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));

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

        stage.setTitle("FXML Welcome");
        stage.setScene(scene);
        stage.show();
    }
}

您要为每一行添加列约束,这意味着最终您将拥有 50 * 30 = 1500 约束而不是 30。您需要在行循环之外的循环中添加列约束。此外,假设在添加约束之前约束列表为空,则无需指定要插入的索引,因为 add 也会插入到 List 的末尾。请检查,如果你真的需要在 fxml 中创建的列约束,因为代码变得有点简单,如果你不需要插入列约束作为列表的倒数第二个元素:

for (int i = 0; i < 30; i++) {
    gridPane.getColumnConstraints().add(columnConstraints);
}
for(int i = 0; i < 50; i++){
    gridPane.getRowConstraints().add(rowConstraints);
    for(int j = 0; j < 30; j++) {
        Button btn = new Button(Integer.toString(j + 1));
        btn.setPrefSize(40, 40);
        gridPane.add(btn, j, i);
    }
}

顺便说一句:请注意,AnchorPane 约束对不是 AnchorPane 的子节点的节点没有任何影响;您可以安全地从 fxml 中的 GridPane 中删除这些约束。