Как получить ScrollPane, чтобы соответствовать всему содержимому MasonryPane - PullRequest
0 голосов
/ 10 октября 2018

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 блоков, и вам просто нужно прокрутить дальше, если ваше окно уже, что является моим намерением / целью.Однако на некоторой, казалось бы, небывалой высоте он просто отсекает все, что будет под ним.Я не могу найти какие-либо настройки или методы, которые оказали бы какое-либо влияние на это.

Использование JFXMasonryPane от JFoenix .Однако я не уверен, является ли это проблемой с их библиотекой или с моим использованием ScrollPane.

1 Ответ

0 голосов
/ 11 октября 2018

Это вызвано тем, что количество строк в панели кладки ограничено 100 (что также является значением по умолчанию).Я не думаю, что вы можете изменить это поведение, потому что ограничение жестко запрограммировано , см., Например, https://github.com/jfoenixadmin/JFoenix/issues/302.. Вы можете использовать метод setLimitRow, чтобы изменить значение, но все значения больше 100 являютсяигнорируется и используется значение по умолчанию / максимальное значение 100.

В вашем примере количество меток равно 6000. Количество строк равно 100 (по умолчанию / максимум, как указано ранее).Предполагая, что большое окно может содержать 25 столбцов, количество меток на панели кладки составляет 100 * 25 = 2500. Таким образом, 6000 - 2500 = 3500 меток не отображаются.Уменьшение ширины окна уменьшает количество столбцов и, следовательно, количество меток.

Проблема всегда будет возникать, если задействовано более 100 дочерних элементов / меток.Самое позднее в случае одного столбца отображаются не все метки.

Для иллюстрации я использую ваш фрагмент кода, но с одинаковыми квадратными метками для простоты.Следующие два снимка экрана (начало и конец) показывают 100 * 25 = 2500 меток для окна с 25 столбцами (6000 - 2500 = 3500 меток не отображаются):

Начало:

enter image description here

Конец:

enter image description here

Следующие два снимка экрана (начало и конец) показывают 100 *1 = 100 меток для окна с 1 столбцом (6000 - 100 = 5900 меток не отображаются):

Начало и конец:

enter image description here

...