2017-05-18 5 views
0

Ich möchte bidirektional binden eine color Eigenschaft mit r, g, b Felder und auch ein ColorPicker. Hier ist, was ich habe:Komplexe Eigenschaften Bindung

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); 

Jetzt muss ich die color binden und spaltete es in r, g, b. Ich weiß, dass ich mit so etwas wie dieses (unidirektional) beginnen:

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

Aber Java löst eine Ausnahme Ein Grenzwert kann nicht eingestellt werden. Gibt es einen anderen Weg, oder sollte ich Hörer verwenden? Vielen Dank!

+0

Was ist Ihr Ziel? Willst du zum Beispiel 'r.set (128)' machen, und 'color' (und folglich den Farbwähler) updaten lassen? Und wenn der Benutzer eine Farbe in der Farbauswahl auswählt, möchten Sie, dass "r", "g" und "b" aktualisiert werden? Ich denke du müsstest zumindest einige Zuhörer dafür benutzen. –

+0

@James_D Ja, genau. Ich weiß, dass es Overkill ist, 'r',' g' und 'b' zu haben, da ich sie durch" Farbe "bringen kann, aber ich habe spezielle Bedürfnisse. Danke, ich werde es mit einem Zuhörer versuchen. – Max

Antwort

1

Wenn Sie möchten, dass alle diese Eigenschaften konsistent sind und unabhängig voneinander geändert werden können (und die anderen bei Bedarf aktualisiert werden müssen), können Sie nur bidirektionale Bindungen und Listener verwenden (nicht in einer Richtung) Bindungen, die nicht erlauben, dass der gebundene Wert so gesetzt wird, als würde dies die Bindung verletzen). Ein möglicher Weg wäre:

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

Danke, es funktioniert perfekt! – Max

Verwandte Themen