Java Swing JTree TreeModel - как сделать ленивую инициализацию

У меня есть JTree в моем приложении Swing для отображения длинного списка данных (режим целочисленного дерева).

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

Вопрос: есть ли способ сделать ленивую инициализацию в TreeModel и получить данные, когда это необходимо?

Спасибо всем


person mhshams    schedule 01.05.2011    source источник


Ответы (2)


TreeWillExpandListener См., например, это

person StanislavL    schedule 01.05.2011
comment
@StanislavL: проблема в том, что когда я устанавливаю модель в Tree, она сразу же извлекает все записи (почти 2000 записей) даже до их отображения. - person mhshams; 01.05.2011
comment
@StanislavL +1 хороший ответ, я вижу, как вы можете использовать его для этой цели. - person Boro; 01.05.2011
comment
@mohammad shamsi, не могли бы вы поделиться кодом, чтобы я мог поиграть с ним, я ненавижу начинать с нуля. И я заинтересован в копируемом решении для дальнейшего использования. - person Boro; 01.05.2011
comment
@mohammad shamsi, вы можете заполнить только первый уровень дерева и получить дочерние элементы выбранного узла перед расширением. - person StanislavL; 01.05.2011
comment
@Stnislavl проблема в том, что у меня более 100 тысяч элементов на первом уровне дерева. - person mhshams; 02.05.2011
comment
Я думаю, вам следует как-то изменить иерархию. Например. добавьте 100 элементов и еще узел... щелчок по узлу загрузит следующие 100. - person StanislavL; 05.05.2011

Я предполагаю, что вы используете DefaultTreeModel.

Я решил эту проблему, внедрив собственный Модель дерева. Это может показаться сложным, но как только вы вникнете в это, вы увидите, что это не так уж и плохо. Вам нужно реализовать только 8 методов, и большинство из них довольно тривиальны, если у вас уже есть древовидная структура данных.

Основное преимущество этого подхода заключается в том, что вы получаете полный контроль над базовой моделью.

person Itay Maman    schedule 01.05.2011
comment
@Maman: у меня есть Custom TreeModel, но результат тот же. сразу после установки модели в JTree она извлекает все узлы дерева. - person mhshams; 01.05.2011
comment
Как устроено ваше дерево? У вас есть рут с 10К непосредственных детей? - person Itay Maman; 01.05.2011
comment
@Maman: да, почти так, у меня есть корень с более чем 20 тысячами непосредственных детей. - person mhshams; 01.05.2011
comment
Тогда вы можете превысить возможности JTree не из-за размера данных, а просто из-за количества дочерних элементов. Я предлагаю вам взломать пользовательскую модель, которая генерирует 20 000 дочерних элементов без фактического создания объектов за кулисами (используйте целое число в качестве ваших объектов и сделайте целое число 0 корнем всех целых чисел от 1 до 20 000) и посмотрите, как это влияет на производительность. проблема. - person Itay Maman; 01.05.2011
comment
@Maman с вашим тестом на подсказки, у меня все еще иногда не хватает памяти (даже при извлечении первого уровня) - person mhshams; 02.05.2011
comment
Почему бы вам не опубликовать свой тестовый код? (попробуйте минимизировать его до наименьшей автономной программы, которая все еще создает проблему) - person Itay Maman; 02.05.2011