Как увеличить прокрутку ScrollPane в JavaFX?

Я использую ScrollPane в своем приложении JavaFX. Панель прокрутки имеет TilePane в качестве содержимого, отображающего тысячи плиток. Скаллинг слишком медленный. Как увеличить прокрутку ScrollPane? Спасибо.


person Warren Nocos    schedule 01.10.2014    source источник


Ответы (1)


Обновление – рекомендуемый подход – используйте ControlsFX GridView

Проект ControlsFX, сторонний проект элементов управления JavaFX, выглядит так, как будто в нем есть элемент управления, соответствующий вашим требованиям. ControlsFX называет элемент управления GridView. Это виртуализированный элемент управления, рекомендованный в решении в этом ответе, но он поставляется предварительно созданным, поэтому вам не нужно реализовывать собственный элемент управления или сильно настраивать ListView, чтобы получить такое поведение.

Вот описание GridView (из его Javadoc):

GridView — это виртуализированный элемент управления для отображения getItems() в визуальном, прокручиваемом, сеточном виде. Другими словами, в то время как ListView показывает одну ListCell на строку, в GridView будет ноль или более экземпляров GridCell в одной строке. Этот подход означает, что количество созданных экземпляров GridCell будет значительно меньше, чем количество элементов в списке элементов GridView, поскольку для видимой области GridView создается только достаточное количество GridCell. Это помогает повысить производительность и уменьшить потребление памяти.

Поскольку каждая GridCell расширяется из Cell, в GridView применяется тот же подход к фабрикам ячеек, что и в других элементах управления пользовательского интерфейса. Это имеет два основных преимущества:

  1. GridCells создаются по запросу и без участия пользователя,
  2. GridCells могут быть произвольно сложными. Простой элемент GridCell может иметь просто установленное свойство text, тогда как более сложный элемент GridCell может иметь произвольно сложный набор сцен внутри своего графического свойства (поскольку он принимает любой узел).

Устаревший ответ

Вместо использования TilePane для содержимого, рассмотрите возможность использования ListView, который является виртуализированным компонентом (например, он создает и отображает только те узлы, которые видны на экране, а не все возможные узлы). Пока вы реализуете это правильно, это, вероятно, будет более эффективным, чем один большой TilePane с тысячами узлов. Если ListView вам не совсем подходит, вы можете использовать концепции в ListViewSkin (вы можете проверьте исходный код приложения), чтобы создать свой собственный аналогичный виртуализированный макет для вашего приложения (хотя не ожидайте, что это будет особенно легко сделать).

как изменить ориентацию ListView?

список .setOrientation(Ориентация.ГОРИЗОНТАЛЬНО)

горизонтальный список

Но, может быть, ваш вопрос не об ориентации (сейчас я немного не понимаю, о чем вы на самом деле спрашиваете).

Возможно, вы хотите создать обычный вертикально ориентированный ListView из пользовательских объектов Row, где каждая строка будет состоять из HBox или одной строки TilePane. По сути, вам нужно будет проделать больше работы, чтобы получить желаемую производительность, вы не найдете готового элемента управления, который будет делать именно то, что вы хотите, и работать хорошо.

К сожалению, предоставление полного примера кода для полного решения вашей проблемы выходит за рамки разумных возможностей ответа StackOverflow.

person jewelsea    schedule 01.10.2014
comment
Спасибо @jewelsea. Но как изменить ориентацию ListView, как в TilePane, где плитки или узлы размещаются слева направо и сверху вниз? В listView.setOrientation(..) доступны следующие варианты: Orientation.VERTICAL и Orientation.Horizontal. - person Warren Nocos; 02.10.2014
comment
Не могли бы вы привести пример GridView, принимающий определенный узел или панель? В этом руководстве GridView принимает список цветов. Но когда я попытался составить список панелей или узлов и передал список в конструкторе GridView, GridView не отображает панели или узлы, а вместо этого имя их класса. Я подозревал, что проблема как-то связана с GridCell и cellFactory, но я не знаю, как их настроить. Пожалуйста помоги. - person Warren Nocos; 06.10.2014