У меня есть приложение с TreeTableView, в которое я добавил поддержку перетаскивания.После действия удаления я обновляю некоторую информацию на сервере и перезагружаю данные в TreeTableView, чтобы поддерживать их актуальность на сервере.К сожалению, это заставляет обновить отображение, и каждый элемент в дереве теперь закрыт.
Что я хотел бы сделать, это как можно скорее восстановить дерево до его состояния перед обновлением.Все предметы, которые были открыты, должны быть открыты.(Вертикальная) полоса прокрутки (если есть) должна быть сброшена в прежнее положение.Пока что у меня есть:
// In view class
var vscroll = -1.0
var scrollbar : ScrollBar? = null
val root = treetableview<IStoryItem> { ... }
internal fun preserveUI() {
scrollbar = root.lookup(".scroll-bar:vertical") as ScrollBar
if (scrollbar != null) vscroll = scrollbar!!.value
expandedItems = root.root.children
.filter { it.isExpanded }
.map { it.value.title }
}
internal fun restoreUI(scene : Scene) {
runLater {
root.root.children
.filter { it.value.title in expandedItems}
.forEach { it.isExpanded = true }
scene.cursor = Cursor.DEFAULT
if (vscroll > 0.0) scrollbar?.value = vscroll
scrollbar = null
vscroll = -1.0
}
}
preserveUI
вызывается из подпрограмм поддержки перетаскивания.restoreUI
вызывается из отдельного потока, когда данные извлекаются с сервера.
Почти все работает должным образом, за исключением настройки положения полосы прокрутки.Я думаю, что происходит то, что позиция полосы прокрутки устанавливается до того, как TreeItems смогут полностью раскрыться, чтобы позиция никогда не была установлена правильно.
Есть ли способ заставить эту работу работать?Я хотел бы изменить свой вид туда, где я его оставил до обновления.