请解释物业代表

时间:2018-05-22 01:17:42

标签: kotlin tornadofx

我正在努力学习Kotlin和TornadoFX。我一直看到的一件事是这样的代码:

val TextProperty = SimpleStringProperty()
var text by Textproperty

我一直在阅读文档

https://edvin.gitbooks.io/tornadofx-guide/content/part2/Property%20Delegates.html

所以我“吸收”它们对于模型中的值发生变化时很有用,但我需要进一步的帮助才能真正理解这个概念。有些东西似乎没有点击。有没有人有任何示例,视频等证明这些财产代表的目的和用途?

2 个答案:

答案 0 :(得分:1)

这里重要的一点是JavaFX需要或至少更喜欢可观察的属性。您可以声明其中一个JavaFX属性类型,而不是声明一个可变属性,具体取决于您想要的属性类型(String,Double,Int等)。您真正需要的是声明此属性:

class Customer {
    val ageProperty = SimpleIntegerProperty()
}

您可以使用此功能,而无需使用任何代表。但是,如果要改变此属性,则需要更改所定义属性中的value属性,因此代码如下所示:

customer.ageProperty.value = 42

这很麻烦,所以为了简单起见,你想要添加getter和setter。手动执行此操作将如下所示:

val ageProperty = SimpleIntegerProperty()     var age:Int         get()= ageProperty.value         set(value){ageProperty.value = value}

现在您可以像这样设置Customer的年龄:

customer.age = 42

这样更方便,但是您必须为每个属性声明所有代码,因此在TornadoFX中我们引入了属性委托,它使用简单的语句处理所有这些,因此:

val ageProperty = SimpleIntegerProperty()
var age by ageProperty

最终结果是一样的,没有你必须做任何繁重的工作。

为了清楚起见,这解释了属性委托,而不是JavaFX属性有用的原因。 JavaFX属性允许您绑定到UI元素,例如文本字段。对文本字段的更改将写回属性,对属性的更改将写回UI。

答案 1 :(得分:0)

一旦你能写出像

这样的东西
class C { var text by Textproperty }

所有c.text = blabla都将汇编为TextProperty.setValue(c, ::text, blabla)c.text将汇编为TextProperty.getValue(c, ::text)。这使得库(TextProperty的提供者)能够接管text上的操作。

参考:https://kotlinlang.org/docs/reference/delegated-properties.html