JavaFX绑定StringProperty和IntegerProperty

Joe*_*oel 1 binding javafx

我对JavaFX中的绑定有疑问。假设我有映射1:“ Aaa”,2:“ Bbb”,3:“ Ccc”,依此类推。我想要的是根据此映射绑定(双向)2个属性IntegerProperty和StringProperty。如何做到这一点?

UPD:我将尝试描述我的用例。我有一堂课

class A {
   IntegerProperty num;
   ...
}
Run Code Online (Sandbox Code Playgroud)

但是在用户界面中,我不想显示此数值,而是显示一些有意义的字符串。所以我想添加StringProperty numValue和绑定numnumValue。在表中,我将numValue用作TableColumn的属性。当用户更改值numValue(例如通过组合框)时,我想num自动更新。

Tom*_*ula 5

我建议尽可能避免双向绑定,因为它们是有问题的1

如果您确实需要双向绑定,那么您很幸运其中一种类型是String。还有就是bindBidirectional方法,它可以让你指定一个StringConverter用来之间转换String和其他类型的T,你的情况Integer

Map<Integer, String> m = ...;
StringProperty sp = ...;
IntegerProperty ip = ...;

Bindings.bindBidirectional(sp, ip, new StringConverter<Number>() {

    @Override
    public Integer fromString(String s) {
        for(Integer key: m.keySet()) {
            if(m.get(key).equals(s)) {
                return key;
            }
        }
        return -1; // or whatever makes sense for you
    }

    @Override
    public String toString(Integer i) {
        return m.get(i);
    }
});
Run Code Online (Sandbox Code Playgroud)

为什么支持类型StringT而不是任意类型)TU这对我来说还是个谜。

更一般地说,你有两种类型,TU,和两个功能,f: T -> U并且g: U -> T,然后要建立之间的双向结合Property<T>,并Property<U>使用这两个功能。在上面的示例中,fg均由StringConverter(例如fis fromStringgis toString)实现。你可以建立这样一个双向绑定使用ReactFXVar小号2

Function<T, U> f = ...;
Function<U, T> g = ...;
Var<T> vt = ...;
Var<U> vu = ...;

Var<U> vu1 = vt.map(f).asVar(u -> vt.setValue(g.apply(u)));
Bindings.bindBidirectional(vu, vu1);
Run Code Online (Sandbox Code Playgroud)

你不一定需要f成为的倒数g,即你不需要g(f(x)) = x,但为了避免无限循环(堆栈溢出),它更好的收敛快,例如f(g(f(x))) = f(x),或g(f(g(f(g(f(g(f(x)))))))) = g(f(g(f(g(f(x))))))或类似的东西。


1我知道我只是在没有提供任何有效论点的情况下就把这句话丢进去了。
2 Var实际上只是Property带有一些额外方法的。