You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TornadoFX TableView如何获取选中行的字段值?

解决TornadoFX TableView双击行获取对象字段值的问题

嗨,这个问题其实很普遍——当你直接打印一个Kotlin对象时,默认会调用它的toString()方法,而如果你的Persona类没有重写这个方法,就会输出那种带内存地址的默认格式,也就是你看到的com.kotlin.test.Persona@581f0ad3。要获取具体的字段值,有两种简单的处理方式:

方式一:直接访问选中对象的属性

你可以在双击事件里,直接获取选中对象的各个字段并打印,记得做空安全处理(因为可能存在没有选中任何行就双击的情况):

onDoubleClick {
    val selectedPerson = this.selectedItem
    selectedPerson?.let {
        println("Nome: ${it.nome}")
        println("Data di nascita: ${it.birthday}")
        println("Età: ${it.eta}")
        // 或者一次性输出所有字段
        println("选中的用户信息:Nome=${it.nome}, Data di nascita=${it.birthday}, Età=${it.eta}")
    }
}

这样就能精准获取每个字段的值,而不是输出对象的内存引用了。

方式二:给Persona类重写toString()方法

如果你希望直接打印selectedItem就能得到友好的字段信息,可以给Persona类重写toString()方法,这样无论在哪里打印这个对象,都会输出你定义的格式:

import java.time.LocalDate
import java.time.temporal.ChronoUnit

data class Persona(val nome: String, val birthday: LocalDate) {
    val eta: Int get() = ChronoUnit.YEARS.between(birthday, LocalDate.now()).toInt()

    override fun toString(): String {
        return "Persona(nome='$nome', Data di nascita=$birthday, Età=$eta)"
    }
}

之后你原来的println(this.selectedItem)就会输出类似这样的内容:

Persona(nome='marco', Data di nascita=1980-12-20, Età=43)

两种方式都能解决你的问题,你可以根据自己的需求选择——如果只是在双击事件里临时获取字段,用方式一就够了;如果希望整个项目里打印Persona对象都有友好格式,方式二更合适。

内容的提问来源于stack exchange,提问作者matteo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:19:19