有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将属性绑定到从JavaFx/FX中的控件派生的值的正确方法

考虑下面的(KOTLIN/TRONADOFX)示例,其目的是通过绑定将文本字段的内容与标签的文本连接起来。标签应反映textfield的派生值,在本例中为哈希值。如何正确实现这种绑定(我觉得使用changelistener不是正确的方式)

class HashView : View("My View") {
    val hashProperty = SimpleStringProperty("EMPTY")

    override val root = vbox {
        textfield {
            hashProperty.bind(stringBinding(text) { computeHash(text)}) // This does not work
        }
        label(hashProperty)
    }
}

PS:java/JavaFX的答案也很受欢迎,只要我能以某种方式在tornadofx中应用这个想法

更新1:我发现只有一个微小的变化才能使我的示例正常工作,即

hashProperty.bind(stringBinding(textProperty() { computeHash(this.value) })

然而,我仍然不确定这是否是传统的做法。所以我将把这个问题留待讨论


共 (2) 个答案

  1. # 1 楼答案

    我建议不要在计算中涉及实际输入元素的属性。您应该首先定义输入属性并将其绑定到textfield。然后创建一个派生的StringBinding并将其绑定到标签。还要注意的是,一个属性有一个内置的stringBinding函数,它会自动对该属性进行操作。这使您的代码看起来更干净,如果需要可以重用,并且更易于维护:

    class HashView : View("My View") {
        val inputProperty = SimpleStringProperty()
        val hashProperty = inputProperty.stringBinding { computeHash(it ?: "EMPTY") }
    
        override val root = vbox {
            textfield(inputProperty)
            label(hashProperty)
        }
    
        fun computeHash(t: String) = "Computed: $t"
    }
    
  2. # 2 楼答案

    在JavaFX中,可以使用StringConverter

        TextField field = new TextField();
        Label label = new Label();
    
        label.textProperty().bindBidirectional(field.textProperty(), new StringConverter<String>() {
    
            @Override
            public String toString(String fieldValue) {
    
                // Here you can compute the hash
                return "hash(" + fieldValue+ ")";
            }
    
            @Override
            public String fromString(String string) {
    
                return null;
            }
    
        });