TornadoFX отображает ObservableList в другой ObservableList - PullRequest
0 голосов
/ 15 октября 2019

У меня есть ObservableList, содержащий ряд пользовательских объектов (val rolls: ObservableList<Roll>). Каждый из этих объектов имеет val results: ObservableList<Pair<Int, Double>>. Пары представляют собой возможное число и вероятность наступления этого результата. Я хотел бы визуализировать эти пары в BarChart. Roll также содержат название серии. Результаты, имена и список бросков могут измениться позже (через пользовательский ввод), что должно быть отражено в диаграмме.

Минимальная выборка класса Roll выглядит следующим образом:

class Roll (
    val results: ObservableList<Pair<Int, Double>>,
    initialName: String
){
    val nameProperty = SimpleStringProperty(initialName)
    var name by nameProperty
}

Я попробовал следующее:

barchart(x = CategoryAxis(), y = NumberAxis()) {
    data = rolls.map { roll ->
        XYChart.Series<String, Number>(roll.name, roll.results.map { (result, chance) ->
            XYChart.Data<String, Number>(result.toString(), chance)
        }.asObservable())
    }.asObservable()
}

Это успешно отображает данные в правильную форму и отображает ее. Проблема этого подхода заключается в том, что он не отражает изменения в rolls или элементы в rolls. Есть ли способ добиться этого?

1 Ответ

0 голосов
/ 16 октября 2019

Я закончил тем, что поместил слушателя изменений в список, который обновляет диаграмму и помещает слушателей изменений во все соответствующие свойства Roll s (которые также обновляют диаграмму):

barchart(x = CategoryAxis(), y = NumberAxis()) {
    animated = true
    updateData(this)
    rolls.forEach {
        it.nameProperty.onChange { updateData(this) }
        it.results.onChange { updateData(this) }
    }
    rolls.onChange {
        updateData(this)
        it.addedSubList.forEach {
            it.nameProperty.onChange { updateData(this) }
            it.results.onChange { updateData(this) }
        }
    }
}

С этой целью я поместил функцию преобразования данных, о которой я упоминал в своем вопросе, в отдельную функцию:

fun updateData(chart: BarChart<String, Number>){
    chart.data = rolls.map { roll ->
        XYChart.Series<String, Number>(roll.name, roll.results.map { (result, chance) ->
            XYChart.Data<String, Number>(result.toString(), chance)
        }.asObservable())
    }.asObservable()
}

Хотя решение все еще выглядит несколько грязным, поэтому, если кто-нибудь знает более чистый способ сделать это, я был бы признателенэто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...