Вам необходимо реализовать ObservableList
, который извлекает только те данные, которые были получены TableView
. В настоящее время вы извлекаете все элементы в таблице и преобразуете полученный список в ObservableList
.
TableView
использует метод .get(int idx)
OL для получения всех элементов, которые должны отображаться, и метод .size()
для определения размера полосы прокрутки. При прокрутке TableView
удалит все элементы, которые не отображаются, и снова вызовет метод get.
Для решения вашей проблемы необходимо создать класс, который implements ObservableList<E>
. Сначала вам нужно реализовать метод .get(int idx)
и .size()
, для всех остальных методов я бы throw new UnsupportedOperationException()
, а позже посмотрю, какой другой метод необходим. Таким образом, метод .size()
должен выполнить следующий запрос
SELECT count(*) FROM product
и get(int idx)
что-то вроде этого
int numItems = 30;
int offset = idx - (idx % numItems)
SELECT * FROM product LIMIT offset, numItems
вы можете создать внутренний список, который содержит только, например, 30 предметов из вашей базы данных и каждый раз, когда запрашивается idx < offset || idx > offset + numItems
, вы отправляете новый запрос базы данных.
Я использовал этот подход с таблицами базы данных с миллионами строк и имел очень производительный графический интерфейс. Вы также можете добавить подкачку к TableView
, потому что для многих строк полоса прокрутки становится бесполезной, но это другое обсуждение.
редактирование:
Я забыл упомянуть, что это называется Ленивая загрузка