TreeViewer для GridTreeViewer: мост между существующими ITreeContentProviders и "ленивым" ObservableListTreeContentProvider

TL;DR

Основываясь на статье Томаса Шиндля JFace-Viewer и Eclipse Databinding с> 10.000 объектов (что предлагает очень хорошую идею), я хотел бы преобразовать обычную TreeViewer + несколько ITreeContentProvider реализации туманности GridTreeViewer который использует ObservableListTreeContentProvider, VisibleRangeChangedListener и Eclipse Data Binding, чтобы сделать его "ленивым" (более ленивым) и загружать данные по требованию.

Как я должен переписать свой существующий регулярный ITreeContentProvider реализации использовать одни и те же иерархии с ObservableListTreeContentProvider? Могу ли я сделать "мост" между старым и новым решением? С помощью DelegatingListProperty как то так? Есть другие идеи?
Я нашел несколько слишком простых примеров, но на самом деле я не понимаю концепции использования привязки данных в таком сложном иерархическом формате дерева.

Примеры деревьев и контент-провайдеров:

Контент провайдер 1.:

|- A1
   |-- B1
       |-- MyMessage1
|- A2
   |-- B2
       |-- MyMessage2

Контент провайдер 2.:

|- C1
   |-- D1
       |-- MyMessage1
|- C2
   |-- D2
       |-- MyMessage2

Более длинное объяснение

У меня есть представление, где я отображаю огромное количество объектов в иерархическом древовидном формате с использованием пользовательских TreeViewerс классическим ITreeContentProvider а также LabelProvider + ITableLabelProvider Реализации. Существует также меню, в котором пользователь может выбрать, в каком формате он хочет видеть эту иерархию. Когда пользователь выбирает другой формат отображения, единственное, что происходит, это то, что другой ITreeContentProvider реализация устанавливается для зрителя, и я обновляю его программно.
Это работает, но из-за огромного количества элементов (в некоторых случаях 100-200 тыс. Строк, пожалуйста, не спрашивайте причины, это просто должно работать), отображение элементов может быть медленным, пользовательский интерфейс иногда зависает, потому что там слушателей TreeItems очень много, обновление представления занимает много времени и т. д.

Поэтому я хотел бы использовать какое-то ленивое решение, когда элементы модели уже загружены в память.
Я уже пробовала SWT.VIRTUAL а также ILazyTreeContentProvider, но он работал плохо (даже если использовать viewer.setUseHashlookup(true)) и был проблематичным (при прокрутке TreeItems загружалось много времени, были ошибки, проблемы с сортировкой, фильтрацией и т. д.).

Сейчас я читаю статью в блоге Томаса Шиндля: JFace-Viewer и Eclipse Databinding с> 10.000 объектов. Я хотел бы попробовать это с помощью Eclipse Nebula Grid GridTreeViewer и + ObservableListTreeContentProvider (который также является ITreeContentProvider реализация) и VisibleRangeChangedListener и "ленивый" провайдер этикеток (как в статье). Могу ли я как-то использовать свой существующий ITreeContentProvider реализации и создать "мост" между этим и новым ObservableListTreeContentProvider?


Кстати, я проверил Nebula NatTable, но мне ОЧЕНЬ было трудно перенести существующих поставщиков контента на это новое решение, его API и его подход полностью отличаются (иерархия идет от дочернего к родительскому, а не наоборот), и документация, связанная с Деревья до сих пор пусты.

1 ответ

Туманность сделала Грид виртуальной некоторое время назад. Вот фрагменты для зрителя, которые содержат несколько примеров для ленивого поставщика контента.

http://git.eclipse.org/c/nebula/org.eclipse.nebula.git/tree/examples/org.eclipse.nebula.snippets/src/org/eclipse/nebula/snippets/grid/viewer

Другие вопросы по тегам