JavaFX GridPane в ScrollPane больше, чем ожидалось

Пока возился с javafx, столкнулся с такой штукой:
создал GridPane, завернул в ScrollPane и залил Buttons, но заранее поменял RowConstraints и ColumnConstraints на 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();
    }
}

person Quipex    schedule 11.11.2017    source источник
comment
Избавьтесь от RowConstraints и ColumnConstraints. Они вам не нужны.   -  person VGR    schedule 11.11.2017


Ответы (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);
    }
}

Кстати: обратите внимание, что ограничения AnchorPane не влияют на узлы, которые не являются дочерними элементами AnchorPane; вы можете безопасно удалить эти ограничения из GridPane в файле fxml.

person fabian    schedule 11.11.2017
comment
›Пожалуйста, проверьте, действительно ли вам нужно ограничение столбца, созданное в fxml.‹br› Действительно, мне это не нужно. Он был создан SceneBuilder, и я подумал, что это необходимо. На самом деле это не так. Я удалил все экземпляры col/rowConstraints как из fxml, так и из контроллера, и теперь все работает нормально. - person Quipex; 11.11.2017