动态表列

时间:2017-10-13 17:15:20

标签: kotlin tornadofx

当我想从仅包含字符串的列表列表(例如来自csv的数据)生成表时,我该如何处理。列的名称无关紧要。从提供的所有示例中,我只看到绑定表项到特定模型(由于我有未知的数字和列名称,因此不适合那里)。

1 个答案:

答案 0 :(得分:2)

如果您已经知道列名和数据类型,我建议硬编码。如果您对格式一无所知,只想创建具有完全动态列的TableView,则可以使用csv数据中的索引作为提取器为数据创建StringProperty值:

class MyView : View() {
    val data = FXCollections.observableArrayList<List<String>>()
    val csvController: CsvController by inject()

    init {
        runAsync {
            csvController.loadData()
        } ui { entries ->
            // Generate columns based on the first row
            entries.first().forEachIndexed { colIndex, name ->
                root.column(name, String::class) {
                    value { row ->
                        SimpleStringProperty(row.value[colIndex])
                    }
                }
            }

            // Assign the extracted entries to our list, skip first row
            data.setAll(entries.drop(1))
        }
    }

    override val root = tableview(data)
}

class CsvController : Controller() {
    // Load data from CSV file here, we'll use som static data
    // where the first row is the headers
    fun loadData() = listOf(
            listOf("Name", "Age"),
            listOf("John", "42"),
            listOf("Jane", "24")
    )
}

Resulting application

此方法仅适用于可视化CSV文件中的数据。如果您需要编辑或操作数据,预先了解数据类型将会产生一个不太脆弱的应用程序IMO:)