我正在努力学习Kotlin和TornadoFX。我一直看到的一件事是这样的代码:
val TextProperty = SimpleStringProperty()
var text by Textproperty
我一直在阅读文档
https://edvin.gitbooks.io/tornadofx-guide/content/part2/Property%20Delegates.html
所以我“吸收”它们对于模型中的值发生变化时很有用,但我需要进一步的帮助才能真正理解这个概念。有些东西似乎没有点击。有没有人有任何示例,视频等证明这些财产代表的目的和用途?
答案 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