Я только начинаю работать с TornadoFX, и я обнаружил, что документация немного скудная о том, как использовать ObservableMap
для заполнения TreeView
и динамического повторного рендеринга при изменении базовых данных.
Мое приложение позволяет пользователю перетаскивать файлы в целевую область. Они добавляются в наблюдаемый список, в который я создал ObjectBinding<Map<File, List<File>>>
, который группирует их по родительскому каталогу. Я хочу отразить карту в TreeView как родительские / дочерние отношения каталогов и файлов.
Следующее будет работать, если files
дано начальное значение, но оно не обновляет дерево для отражения изменений вэто:
class DrawableView : View("Drawables") {
private var filesList: TreeView<File> by singleAssign()
private val files = FXCollections.observableArrayList<File>()
private val folders = Bindings.createObjectBinding(Callable {
files.groupBy { File(it.parent) }
}, files)
override val root = vbox {
filesList = treeview {
root = TreeItem(File("All"))
isShowRoot = false
cellFormat { text = it.name }
populate { node ->
val item = node.value
when {
node == root -> folders.value.keys
item is File -> folders.value[item]
else -> null
}
}
}
}
...
}
Любой совет? Это ожидаемый результат: