javafx - 从 getValue() 和 setValue() 函数之外的 Delegated Property 中获取 KProperty 信息

标签 javafx properties delegates kotlin

我正在尝试实现 JavaFX Property与委托(delegate)的 Kotlin 属性接口(interface),以便可以像这样使用它:

class Foo(bar:Bar){
    val barProperty=PropertyFX(bar)
    var bar by barProperty
}

我为此写了一个小类(大部分):
class PropertyFX<T>(value:T):SimpleObjectProperty<T>(value),ReadWriteProperty<Any?,T>{
    override fun getValue(thisRef:Any?,property:KProperty<*>)=get()
    override fun setValue(thisRef:Any?,property:KProperty<*>,value:T)=set(value)
}

但是,这个类没有实现接口(interface)的 getBean() 和 getName() 方法。它们应该分别从 getValue() 和 setValue() 函数中引用的参数返回值 thisRef 和 property.name,但我无法从函数外部访问这些参数。

我可以在第一次使用它们时存储这些值,如下所示:
class PropertyFX<T>(value:T):SimpleObjectProperty<T>(value),ReadWriteProperty<Any?,T>{
    private var bean:Any?=null
    private var name=""
    override fun getBean()=bean
    override fun getName()=name
    override fun getValue(thisRef:Any?,property:KProperty<*>):T{
        bean=thisRef
        name=property.name
        return get()
    }
    override fun setValue(thisRef:Any?,property:KProperty<*>,value:T){
        bean=thisRef
        name=property.name
        set(value)
    }

但这似乎是一个可怕的 hack,它没有返回 getBean() 的正确值。和 getName()直到该属性被访问一次。有没有办法在不将它们传递给构造函数的情况下更早地获取这些值,就像 SimpleObjectProperty 所要求的那样?

最佳答案

这在 Kotlin 的预发布版本中曾经是可能的,其中委托(delegate)属性有一个额外的方法 propertyDelegated()在委托(delegate)属性的初始设置期间调用。该方法在 1.0 之前不久被删除,但它(或等效功能)很可能会在 future 的版本中重新添加。

目前,我怀疑您现有的解决方案是最好的选择。

关于javafx - 从 getValue() 和 setValue() 函数之外的 Delegated Property 中获取 KProperty 信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36185885/

相关文章:

java - javaFX 复选框和组合框

java - 在 FXML 中引用 Controller 类属性

java - 每次 git 推送都会删除未跟踪的文件

ios - 在UICollectionView中实现按钮点击

JavaFX TableColumn 图形不隐藏

JavaFX observableList 作为 Map 中的值

css - 如何让自定义 CSS 按钮根据图像自动调整大小

c# - 派生类中的别名属性名称?

ios - tableView reloadData 不起作用,委托(delegate)方法

ios - animationDidStop 方法的多个 CAAnimations?