我对JavaFX中的绑定有疑问。让我们说我有映射1:" Aaa",2:" Bbb",3:" Ccc"等等。我想要的是根据这个映射绑定(双向)2个属性IntegerProperty和StringProperty。如何实现这一目标?
UPD:我会尝试描述我的用例。我有一个班级
class A {
IntegerProperty num;
...
}
但是在用户界面中,我想要显示的不是这个数值,而是一些有意义的字符串。所以我想添加StringProperty numValue
并绑定num
和numValue
。在表I中,使用numValue
作为TableColumn的属性。当用户更改numValue
的值(例如通过组合框)时,我希望num
自动更新。
答案 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
类型而不支持任意类型T
和T
对我来说是个谜。
更一般地说,您有两种类型,U
,T
和两个函数,U
和f: T -> U
,然后您希望使用这两个函数在g: U -> T
和Property<T>
之间建立双向绑定。在上面的示例中,Property<U>
和f
都由g
实现(例如,StringConverter
为f
,fromString
为{{ 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
,但为了避免无限循环(堆栈)溢出),它更快收敛,例如g
或g(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))))))
。