如何获取ScrollPane以适合MasonryPane的所有内容

时间:2018-10-09 23:10:15

标签: java javafx scrollpane

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个随机大小/颜色的块。但是,可能看到的数量取决于窗口的宽度,并且随着更改窗口的大小而变化。从理论上讲,这应该显示所有6000个块,并且如果您的窗口较窄,则只需要向下滚动即可,这是我的意图/目标。但是,在某种看似平稳的高度上,它只会截断其下方的任何物体。我找不到对它有任何影响的任何设置或方法。

通过JFoenix使用JFXMasonryPane。但是,我不确定这是否是他们的库或使用ScrollPane时遇到的问题。

1 个答案:

答案 0 :(得分:1)

这是由于砖石窗格中的行数限制为100(这也是默认值)引起的。我认为您无法更改该行为,因为该限制是硬编码的,请参见例如https://github.com/jfoenixadmin/JFoenix/issues/302。 您可以使用setLimitRow方法更改值,但是所有大于100的值都将被忽略,并使用默认值/最大值100。

在您的示例中,标签数为6000。行数为100(如前所述,默认/最大值)。假设一个大窗口可以包含25列,则砖石窗格中的标签数为100 * 25 =2500。因此,无法显示6000-2500 = 3500的标签。减小窗口的宽度会减少列数,从而减少标签数。

如果涉及超过100个孩子/标签,则总是会出现此问题。在一列的情况下,最晚不会显示所有标签。

为便于说明,我使用您的代码段,但为简单起见,使用等号的正方形。以下两个屏幕截图(开始和结束)显示了一个带有25列的窗口的100 * 25 = 2500个标签(不显示6000-2500 = 3500个标签):

开始:

enter image description here

结束:

enter image description here

接下来的两个屏幕截图(开始和结束)显示了带有1列的窗口的100 * 1 = 100个标签(不显示6000-100 = 5900个标签):

开始和结束:

enter image description here