Java 复杂属性绑定

Java 复杂属性绑定,java,javafx,properties,Java,Javafx,Properties,我想将color属性与r、g、b字段以及颜色选择器进行双向绑定。以下是我所拥有的: private IntegerProperty r = new SimpleIntegerProperty(); private IntegerProperty g = new SimpleIntegerProperty(); private IntegerProperty b = new SimpleIntegerProperty(); private ObjectProperty<Color> c

我想将
color
属性与
r
g
b
字段以及颜色选择器进行双向绑定。以下是我所拥有的:

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);
但是Java抛出异常无法设置绑定值。 还有其他方法吗?或者我应该使用侦听器吗?
谢谢大家!

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

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);
ChangeListener组件Listener=(obs、oldValue、newValue)->
color.set(color.rgb(r.get(),g.get(),b.get());
r、 addListener(componentListener);
g、 addListener(componentListener);
b、 addListener(componentListener);
addListener((obs、oldColor、newColor)->{
r、 set((int)/(256*newColor.getRed());
g、 set((int)/(256*newColor.getGren());
b、 set((int)/(256*newColor.getBlue());
});
colorPicker.valueProperty().BindDirective(颜色);

你的目标是什么?你是否希望能够做到,例如,
r.set(128)
,并拥有
颜色(以及相应的颜色选择器)更新?如果用户在颜色选择器中选择了一种颜色,你想更新
r
g
、和
b
?我想你至少需要使用一些侦听器来实现这一点。@James\u D是的,没错。我知道有
r
g
b
,因为我可以通过
color
但我有特殊需要。谢谢你,我会找一个倾听者。
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);