繁体   English   中英

TornadoFX/JavaFX 树视图在改变多个 ObservableList 后无法正确重新填充

[英]TornadoFX/JavaFX treeview doesnt repopulate correctly after mutating multiple ObservableList

问题描述

我有一个树视图(TornadoFX),其中填充了 3 个可观察列表。 如果我改变 3 个列表(首先清除它们而不是添加新内容),则树视图仅包含 Observable Lists 之一的内容

我调试的解释

treewiev 在第一个 List 有它的新内容而其他 2 个仍然是空的那一刻实现自己。 一旦其他 2 个列表获得新内容,它不会立即实现。

到目前为止我尝试过的

  • 在我改变 List 以清空 treewiev 之前调用 treeview.root.children.clear() (相同的结果)
  • 在设置所有列表后调用 treeview.refresh() (相同的结果)

我的(或多或少是伪)代码

{//Classes
 R extends X
 A(val name :String) extends X
 B(val name :String, val A :String) extends X
 C(val B :String) extends X
}

{//this is how the Lists get their content each time
 private val aList = observableListOf<A>()
 private val bList = observableListOf<B>()
 private val cList = observableListOf<C>()

 fun setLists(){
     a.clear()
     b.clear()
     c.clear()
     //...
     a.add(...)
     b.add(...)
     c.add(...)

 }
}

{
 treeview<X> {
 root = TreeItem(R)
            populate{ parent ->
                if (parent == root){
                    aList
                } else if (parent.value is A){
                    bList.filter { it.A == parent.value.name } //works always
                }else if (parent.value is B){
                    cList.filter { it.B == parent.value.name } //works at first start but not after set setLists() get recalled
                }else {
                    emptyList<X>() //not sure if this is really needed but the compiler needs something here
                }
            }
 }
}

副题

如果您愿意,请忽略此问题:Intelij 能够运行我的 TornadoFX 应用程序(从主应用程序或带有 TornadoFX 插件的应用程序),但是如果我尝试导出它,它不会运行(无论是 jar 还是 jnlp)。 即使我在 Artifact 菜单中选择 TornadoFX 和所有其他库。 但是:如果我在 JavaFX 选项卡中选择 Native Bundle -> image,则生成的 exe(并且只有 exe)正在运行。 我还尝试使用 com.github.johnrengelman.shadow 5.2.0 Plugin 创建一个 shadowJar,但这也不起作用。 那么如何将程序导出为 jar(最好是包含 TornadoFX 的 fatjar)?

好吧,我不知道这是否是完美的解决方案,但我只是清除孩子并再次填充树视图。 它有效,但如果这是预期的方式,它并不像我想象的那样“被动”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM