将属性绑定到派生自JavaFx / TornadoFX中的控件的值的正确方法

时间:2018-07-13 22:56:32

标签: java javafx data-binding kotlin tornadofx

请考虑以下(kotlin / tornadofx)示例,该示例旨在通过绑定将文本字段的内容与标签的文本连接起来。标签应反映文本字段的派生值,在这种情况下为散列。我如何正确实现这种绑定(我觉得使用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:只要我能以某种方式在Tornadofx中应用该思想,也欢迎使用Java / JavaFX的答案。

更新1 :我发现只有一个小小的改动就可以使我的示例正常工作,即应该如此

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

但是我仍然不确定这是否是常规的方式。所以我将保留这个问题。

2 个答案:

答案 0 :(得分:1)

在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;
        }

    });

答案 1 :(得分:1)

我建议在计算中不要包含实际输入元素的属性。您应该先定义输入属性,然后将其绑定到文本字段。然后创建派生的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"
}