JavaFX绑定StringProperty和IntegerProperty

时间:2015-03-10 20:12:48

标签: binding javafx

我对JavaFX中的绑定有疑问。让我们说我有映射1:" Aaa",2:" Bbb",3:" Ccc"等等。我想要的是根据这个映射绑定(双向)2个属性IntegerProperty和StringProperty。如何实现这一目标?

UPD:我会尝试描述我的用例。我有一个班级

class A {
   IntegerProperty num;
   ...
}

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

1 个答案:

答案 0 :(得分:4)

如果可以的话,我建议避免双向绑定,它们是有问题的 1

如果您确实需要双向绑定,那么您很幸运,其中一种类型为String。有bindBidirectional方法允许您指定用于在StringConverter和其他类型String之间进行转换的T,在您的情况下{{1} }。

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); } }); String类型而不支持任意类型TT对我来说是个谜。

更一般地说,您有两种类型,UT和两个函数,Uf: T -> U,然后您希望使用这两个函数在g: U -> TProperty<T>之间建立双向绑定。在上面的示例中,Property<U>f都由g实现(例如,StringConverterffromString为{{ 1}})。您可以使用ReactFX g s 2 建立这样的双向绑定:

toString

您不一定需要Var成为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); 的倒数,即您不需要f,但为了避免无限循环(堆栈)溢出),它更快收敛,例如gg(f(x)) = x或类似的东西。


1 我意识到我刚刚提出这个陈述而没有提供任何有效的论据 2 f(g(f(x))) = f(x)实际上只是一个带有一些额外方法的g(f(g(f(g(f(g(f(x)))))))) = g(f(g(f(g(f(x))))))