2017-05-18 72 views
0

我想bidirectionaly一个color属性绑定与rgb领域,也是一个颜色拾取。以下是我有:复杂性结合

private IntegerProperty r = new SimpleIntegerProperty(); 
private IntegerProperty g = new SimpleIntegerProperty(); 
private IntegerProperty b = new SimpleIntegerProperty(); 
private ObjectProperty<Color> color = new SimpleObjectProperty<>(); 

ColorPicker colorPicker = new ColorPicker(); 
// Bind the colorPicker and 'color' 
colorPicker.valueProperty().bindBidirectional(color); 

现在我需要绑定color并在rgb分裂。我知道我可以像这样的东西(单向)开始:

color.bind(Bindings.createObjectBinding(
     () -> Color.rgb(r.get(), g.get(), b.get()), 
     r, g, b 
)); 

但Java抛出一个异常一个绑定的值不能设置。 是否有另一种方法来做到这一点或应该使用听众? 谢谢!

+0

你的目标是什么?你是否希望能够做到,例如'r.set(128)',并且让'颜色'(以及颜色选择器)更新?如果用户在颜色选择器中选择颜色,是否要'r','g'和'b'更新?我认为你必须至少使用一些听众。 –

+0

@James_D是的,正好。我知道有'r','g'和'b'这样的技巧是有点矫枉过正的,因为我可以通过'color'来获取它们,但我有特殊需求。谢谢,我会尝试与听众。 – Max

回答

1

如果您希望所有这些属性保持一致,并希望能够独立地更改其中的任何一个(并且根据需要更新其他属性),那么您只能使用双向绑定和侦听器(而不是单向绑定,它不允许将绑定值设置为会违反绑定)。一种可能的方式是:

ChangeListener<Number> componentListener = (obs, oldValue, newValue) -> 
    color.set(Color.rgb(r.get(), g.get(), b.get()); 
r.addListener(componentListener); 
g.addListener(componentListener); 
b.addListener(componentListener); 

color.addListener((obs, oldColor, newColor) -> { 
    r.set((int)/(256*newColor.getRed())); 
    g.set((int)/(256*newColor.getGren())); 
    b.set((int)/(256*newColor.getBlue())); 
}); 

colorPicker.valueProperty().bindBidirectional(color); 
+0

谢谢,它完美的作品! – Max