如何绑定两个不同的JavaFx属性:String和Double(使用StringConverter)?

时间:2014-01-30 07:32:45

标签: binding properties javafx

对于这段代码(JavaFX)。

StringProperty sp;
DoubleProperty dp;

StringConverter<Double> converter = new DoubleStringConverter();    

Bindings.bindBidirectional(sp, dp, converter);

我收到编译错误(在Eclipse IDE中)

这是方法签名:

public static <T> void bindBidirectional(Property<String> stringProperty, Property<T> otherProperty, StringConverter<T> converter)

但是如果我删除了(StringConverter)的参数化,那么我只会得到警告和代码。

StringConverter converter = new DoubleStringConverter();    

我试图避免使用原始类型的泛型,这样我就不必在IDE中抑制警告。

  

所以问题是:
  编写这段代码的正确模式是什么?

2 个答案:

答案 0 :(得分:21)

这可能是JavaFX属性中的一个小“陷阱”。如果仔细观察签名:

static <T> void bindBidirectional(Property<java.lang.String> stringProperty,
    Property<T> otherProperty, StringConverter<T> converter)

转换器的参数必须与属性的参数匹配。但是(这里的惊喜)DoubleProperty实现Property<Number>,因此bindBidirectional中的不匹配。幸运的是,解决方案很简单:使用NumberStringConverter

StringProperty sp = ...;
DoubleProperty dp = ...;
StringConverter<Number> converter = new NumberStringConverter();
Bindings.bindBidirectional(sp, dp, converter);

您可以获得指定转换格式的额外好处。

答案 1 :(得分:0)

这是我的解决方案的答案:

    ArrayList<Pair<Slider,Label>> sliderList = new ArrayList<Pair<Slider,Label>>(
            Arrays.asList(
                    new Pair<Slider,Label>(soundSlider, soundLabel),
                    new Pair<Slider,Label>(videoSlider, videoLabel),

    sliderList.forEach(p->{
        Bindings.bindBidirectional(p.getValue().textProperty(), p.getKey().valueProperty(), new NumberStringConverter() {
            @Override
            public String toString(Number value) {
                return super.toString(Math.round((double) value));
            }
        }); 
    });