Treeview TornadoFX / JavaFX не заполняется правильно после изменения нескольких ObservableList

Описание проблемы

У меня есть древовидное представление (TornadoFX), которое заполняется тремя наблюдаемыми списками. Если я изменю 3 списка (сначала очистите их, чем добавлю новый контент), древовидная структура будет содержать только содержимое одного из наблюдаемых списков.

Интерпретация моей отладки

Древовидная диаграмма актуализируется в тот момент, когда в первом списке появляется новое содержимое, а два других остаются пустыми. Он не актуализируется, как только другие 2 списка получат новое содержание.

Что я пробовал до сих пор

  • вызов 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). Даже если я выберу TornadoFX и все другие библиотеки в меню Artifact. НО: если я выберу Native Bundle -> изображение на вкладке JavaFX, полученный exe (и только exe) будет работать. Я также попытался создать shadowJar с помощью плагина com.github.johnrengelman.shadow 5.2.0, но это тоже не сработало. Итак, как я могу экспортировать программу в виде jar-файла (в лучшем случае - fatjar, включая TornadoFX)?


person Yava    schedule 20.12.2019    source источник
comment
@fabian Sry - это опечатка, которая произошла, когда я отвел фактические имена классов с помощью простого текстового редактора. Я поправлю. Это правильно в фактическом коде, и, как я уже сказал, древовидное представление заполняется правильно в первый раз, у меня возникают проблемы только в том случае, если я потом снова изменю список. Изменить: я исправил опечатку   -  person Yava    schedule 21.12.2019


Ответы (1)


Ну, я не знаю, идеальное ли это решение, но я просто очищаю детей и снова заполняю древовидное представление. Это работает, но если это так, то не так "реактивно", как я думал.

person Yava    schedule 21.12.2019