如何让 ScrollPane 适合 MasonryPane 的所有内容

How to get a ScrollPane to fit all the contents of a MasonryPane

java 控制器

public class MainContentController implements Initializable {

    @FXML private ScrollPane scrollPane;


    public void initialize(URL arg0, ResourceBundle arg1) {     
        Random r = new Random();
        JFXMasonryPane masonryPane = new JFXMasonryPane();
        scrollPane.setContent(masonryPane);
        scrollPane.setFitToWidth(true);
        for (int i = 0; i < 6000; i++) {
            Label lbl = new Label(String.valueOf(i));
            lbl.setAlignment(Pos.CENTER);
            lbl.setPrefSize(r.nextInt(200), r.nextInt(200));
            lbl.setStyle("-fx-background-color:rgb(" + r.nextInt(255) + "," + r.nextInt(255) + "," + r.nextInt(255) + ");");
            masonryPane.getChildren().add(lbl);
        }
    }

}

和 FXML

<GridPane xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MainContentController">
   <rowConstraints>
      <RowConstraints percentHeight="20.0" />
      <RowConstraints percentHeight="20.0" />
      <RowConstraints percentHeight="20.0" />
      <RowConstraints percentHeight="20.0" />
      <RowConstraints percentHeight="20.0" />
   </rowConstraints>
   <columnConstraints>
      <ColumnConstraints percentWidth="25.0" />
      <ColumnConstraints percentWidth="25.0" />
      <ColumnConstraints percentWidth="25.0" />
      <ColumnConstraints percentWidth="25.0" />
   </columnConstraints>
   <children>
      <ScrollPane fx:id="scrollPane" GridPane.columnSpan="4" GridPane.halignment="CENTER" GridPane.rowIndex="2" GridPane.rowSpan="3" GridPane.valignment="CENTER"/>
   </children>
</GridPane>

尽量使用最简单的示例来说明我的意思。当您执行此代码时,它会像预期的那样随机生成 6000 个 sized/colored 块。但是,可以看到的数量取决于 window 的宽度,并且会随着您的更改而调整。理论上,这应该显示所有 6000 个块,如果你的 window 更窄,你只需要向下滚动,这是我的 intent/goal。然而,在一些看似平静的高度,它只是切断了它下面的任何东西。我找不到对此有任何影响的任何设置或方法。

JFoenix 使用 JFXMasonryPane。但是,我不确定这是他们的库问题还是我对 ScrollPane 的使用问题。

这是因为masonry pane中的行数被限制为100(这也是默认值)。我不认为你可以改变这种行为,因为限制是硬编码,参见例如https://github.com/jfoenixadmin/JFoenix/issues/302。 您可以使用 setLimitRow 方法更改该值,但所有大于 100 的值都将被忽略并使用 default/maximum-value 100。

在您的示例中,标签数为 6000。行数为 100(default/maximum 如前所述)。假设一个大 window 可以包含 25 列,砌体窗格中的标签数量为 100 * 25 = 2500。因此,6000 - 2500 = 3500 个标签不可显示。减小 window 的宽度会减少列数,从而减少标签数。

超过100个childs/labels就会出现这个问题。最迟在一列的情况下,并不是所有的标签都显示出来。

为了说明,我使用了您的代码片段,但为了简单起见,我使用了相同的正方形标签。以下两个屏幕截图(开头和结尾)显示了 25 列的 window 的 100 * 25 = 2500 个标签(不显示 6000 - 2500 = 3500 个标签):

开始:

结束:

接下来的两个屏幕截图(开头和结尾)显示了 window 的 100 * 1 = 100 个标签(不显示 6000 - 100 = 5900 个标签):

开始和结束: