以编程方式扩展TreeItems并在TornadoFX中设置滚动位置

时间:2019-02-14 01:37:47

标签: kotlin tornadofx

我有一个带有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有机会完全展开之前就已经设置了滚动条的位置,因此该位置从未正确设置。

有没有办法使这项工作有效?我想将视图重新定位到更新之前的位置。

0 个答案:

没有答案
相关问题