提问者:小点点

ScrollPane中的JavaFX GridPane比预期的要大


示例。f xml

<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();
    }
}

共1个答案

匿名用户

您正在为每一行添加列列约束,这意味着最终您将拥有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);
    }
}

BTW:注意AnchorPane约束对不是AnchorPane子项的节点没有任何影响;您可以安全地从fxml中的GridPane中删除这些约束。