kotlin 尝试实现TornadoFX“激励示例”

8e2ybdfx  于 2023-01-31  发布在  Kotlin
关注(0)|答案(1)|浏览(100)

我试着从这个页面实现激励的例子:https://docs.tornadofx.io/0_subsection/1_why_tornadofx
为此,我需要一个数据类Person,定义如下:

class Person(id: Int, name: String, birthday: LocalDate) {
    val idProperty = SimpleIntegerProperty(id)
    var id by idProperty

    val nameProperty = SimpleStringProperty(name)
    var name by nameProperty

    val birthdayProperty = SimpleObjectProperty(birthday)
    var birthday by birthdayProperty

    val age: Int get() = Period.between(birthday, LocalDate.now()).years
}

为此,需要进行以下导入:

import javafx.beans.property.SimpleIntegerProperty
import javafx.beans.property.SimpleObjectProperty
import javafx.beans.property.SimpleStringProperty
import java.time.LocalDate
import java.time.Period

但是,如果我尝试运行该示例,我会得到以下错误:

Kotlin: Property delegate must have a 'getValue(Person, KProperty<*>)' method. None of the following functions is suitable: 
public open fun getValue(): Int! defined in javafx.beans.property.SimpleIntegerProperty

我可以通过不使用委托类型并像这样设置属性来避免这种情况:

val idProperty = SimpleIntegerProperty(id)
    var id: Int
        get() = idProperty.value
        set(value) { idProperty.value = value}

但这似乎违背了在TornadoFX中使用委托的意义,因为这是他们使用委托的激励性示例。
下面是我在委托类型中发现的内容:https://edvin.gitbooks.io/tornadofx-guide/content/part2/Property_Delegates.html
不过,这并不能帮助var id by idProperty的简写工作。
有人能给我指一下正确的方向吗?

nxowjjhe

nxowjjhe1#

您还需要导入以下内容:

import tornadofx.getValue
import tornadofx.setValue

这些是为JavaFX中的各种类型(例如,属性、可观察值等)定义的扩展操作符函数,以便这些类型可以用作委托。但这些函数并没有在这些类型中定义,因此需要额外的导入。

相关问题