我有一个带有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有机会完全展开之前就已经设置了滚动条的位置,因此该位置从未正确设置。
有没有办法使这项工作有效?我想将视图重新定位到更新之前的位置。