Binding JavaFX绑定StringProperty和IntegerProperty

Binding JavaFX绑定StringProperty和IntegerProperty,binding,javafx,Binding,Javafx,我对JavaFX中的绑定有一个问题。假设我有映射1:Aaa、2:Bbb、3:Ccc等等。我想要的是根据这个映射绑定双向2属性IntegerProperty和StringProperty。如何做到这一点 UPD:我将尝试描述我的用例。我有一节课 class A { IntegerProperty num; ... } 但是在用户界面中,我想显示的不是这个数值,而是一些有意义的字符串。所以我想添加StringProperty numValue和bind num和numValue。在表中

我对JavaFX中的绑定有一个问题。假设我有映射1:Aaa、2:Bbb、3:Ccc等等。我想要的是根据这个映射绑定双向2属性IntegerProperty和StringProperty。如何做到这一点

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

class A {
   IntegerProperty num;
   ...
}

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

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

如果您真的需要双向绑定,那么幸运的是您的类型之一是String。有一种方法可以让您指定一个StringConverter,用于在字符串和其他类型T(在您的例子中为Integer)之间进行转换

你不一定需要f是g的倒数,也就是说,你不需要gfx=x,但是为了避免无限循环堆栈溢出,它最好能快速收敛,例如fgfx=fx,或gfx=gfx或类似的东西

我意识到我只是在没有提供任何有效论据的情况下插入了这句话。
2 Var实际上只是一个带有一些额外方法的属性。

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

如果您真的需要双向绑定,那么幸运的是您的类型之一是String。有一种方法可以让您指定一个StringConverter,用于在字符串和其他类型T(在您的例子中为Integer)之间进行转换

你不一定需要f是g的倒数,也就是说,你不需要gfx=x,但是为了避免无限循环堆栈溢出,它最好能快速收敛,例如fgfx=fx,或gfx=gfx或类似的东西

我意识到我只是在没有提供任何有效论据的情况下插入了这句话。
2var实际上只是一个带有一些额外方法的属性。

为什么需要绑定某些东西?是因为映射可以更改吗?e、 g.2:Bbb可能变成2:Zzz?您使用两个属性绑定了什么-单个映射条目,例如2:Bbb?因为只有两个属性无法绑定到整个映射。我想,即使您将属性绑定到单个映射条目,这仍然有点模糊,因为一个映射对于两个不同的键可以有两个相同的值,例如:一:多。如果有2:Bbb和3:Bbb,那么Bbb对应的绑定整数值是多少?您可能需要对您的问题进行一些处理,以便更精确地指定它。这是一个有趣的问题。。。也许可以添加一些代码,彻底演示如果API可用,您将如何使用它。Tomas Mikula提出的解决方案帮助了我。为什么你需要绑定一些东西?是因为映射可以更改吗?e、 g.2:Bbb可能变成2:Zzz?您使用两个属性绑定了什么-单个映射条目,例如2:Bbb?因为只有两个属性无法绑定到整个映射。我想,即使您将属性绑定到单个映射条目,这仍然有点模糊,因为一个映射对于两个不同的键可以有两个相同的值,例如:一:多。如果有2:Bbb和3:Bbb,那么Bbb对应的绑定整数值是多少?您可能需要对您的问题进行一些处理,以便更精确地指定它。这是一个有趣的问题。。。也许可以添加一些代码,彻底演示如果API可用,您将如何使用它。Tomas Mikula提出的解决方案帮助了我。谢谢。这正是我需要的。为什么你认为双向映射有问题?我已经描述了我的用例。你觉得我会有问题吗?谢谢。这正是我需要的。为什么你认为双向映射有问题?我已经描述了我的用例。你觉得我会有问题吗?
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);
    }
});
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);