【问题标题】:JavaFX binding StringProperty and IntegerPropertyJavaFX 绑定 StringProperty 和 IntegerProperty
【发布时间】:2015-03-10 20:12:47
【问题描述】:

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

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

class A {
   IntegerProperty num;
   ...
}

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

【问题讨论】:

  • 为什么需要绑定东西?是因为映射可以改变吗?例如2:“Bbb”可能变成 2:“Zzz”?你用你的两个属性绑定了什么 - 一个地图条目,例如2:“BB”?因为只有 2 个属性,您无法绑定到整个地图。
  • 我猜,即使您限制绑定单个映射条目的属性,它仍然有点模糊,因为映射可以具有两个不同键的相同值,例如一:许多。如果您有 2:“Bbb”和 3:“Bbb”,那么“Bbb”对应的绑定整数值是多少?您可能需要稍微处理您的问题以更准确地指定它。不过,这是一个有趣的问题……也许可以添加一些代码,彻底演示如果 API 可用,您将如何使用它。
  • 我用我的用例描述更新了我的问题。 Tomas Mikula 提出的解决方案帮助了我。

标签: binding javafx


【解决方案1】:

如果可以的话,我建议避免双向绑定,它们是有问题的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);
    }
});

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

更笼统地说,你有两种类型,TU,和两个函数,f: T -&gt; Ug: U -&gt; T,然后你想在它们之间建立一个双向绑定Property&lt;T&gt;Property&lt;U&gt; 使用这两个函数。在上面的例子中,fg都是由StringConverter实现的(例如ffromStringgtoString)。您可以使用ReactFXVars2 建立这样的双向绑定:

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);

你不一定需要fg 的倒数,即你不需要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 我意识到我只是在没有提供任何有效参数的情况下输入了这个语句。
2Var 实际上只是一个带有一些额外方法的 Property .

【讨论】:

  • 谢谢。这正是我需要的。为什么你认为双向映射有问题?我已经描述了我的用例。你认为我会遇到一些问题吗?
猜你喜欢
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多