我有SimpleIntegerProperty
并希望从中获取SimpleObjectProperty<Color>
。
为此我想象一些像溪流和选择的机制:
SimpleIntegerProperty intProp;
ObjectProperty<Color> colorProp = intProp.map(i -> convertIntToColor(i), c -> convertColorToInt(c));
是否已经内置了某些东西,或者我真的需要自己推出这个内容吗?
如果没有这样的事情似乎很奇怪,因为看Bindings
的所有力量会让你强烈感觉到这个特征也应该存在。
谢谢!
答案 0 :(得分:4)
不确定这是否是最佳方式,但这似乎可以使用Bindings.createObjectBinding
:
@Test
public void test() {
SimpleIntegerProperty simpleIntegerProperty = new SimpleIntegerProperty(1);
ObjectBinding<Color> binding = Bindings
.createObjectBinding(() -> converToColor(simpleIntegerProperty.get()), simpleIntegerProperty);
System.out.println(binding.get());
binding.addListener(new ChangeListener<Color>() {
@Override
public void changed(ObservableValue<? extends Color> observable, Color oldValue, Color newValue) {
System.out.println(newValue);
}
});
simpleIntegerProperty.set(2);
}
private Color converToColor(int i) {
switch (i) {
case 1:
return Color.RED;
case 2:
return Color.BLUE;
}
return null;
}
答案 1 :(得分:1)
如果您只想使用标准JavaFX库,Wim的答案是最好的方法。如果您乐意将第三方库添加到项目中,Tomas Mikula的ReactFX(版本2.0或更高版本)提供了开箱即用的功能:
IntegerProperty rgba = new SimpleIntegerProperty();
Property<Color> color = Var.mapBidirectional(rgba.asObject(),
this::convertIntToColor, this::convertColorToInt);
// ...
private Color convertIntToColor(Integer rgba) {
// ...
}
private Integer convertColorToInt(Color c) {
// ...
}