如何让 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 个标签):
开始和结束:
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 个标签):
开始和结束: