对于这段代码(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中抑制警告。
所以问题是:
编写这段代码的正确模式是什么?
答案 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));
}
});
});