简体   繁体   中英

Binding to a shape fillProperty JavaFX

How can I bind a three doubleProperty Red, Green and Blue to a 'circle.fillProperty()' in JavaFX?

I can easily bind for example the radiusProperty of a circle to a doubleProperty like this:

Circle circle = new Circle();
circle.radiusProperty().bind(boid.getRadiusProperty());

You can use Bindings.createObjectBinding .

The fillProperty of the Circle has the type of ObjectProperty<Paint> so you have to create a Paint object in the binding:

private IntegerProperty r = new SimpleIntegerProperty(0);
private IntegerProperty g = new SimpleIntegerProperty(0);
private IntegerProperty b = new SimpleIntegerProperty(0);

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

Here is a complete example:

This example uses Spinner s as input control, note that the valueProperty of these controls could be directly used as dependency of the binding.

public class Main extends Application {

    private IntegerProperty r = new SimpleIntegerProperty(0);
    private IntegerProperty g = new SimpleIntegerProperty(0);
    private IntegerProperty b = new SimpleIntegerProperty(0);

    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root = new BorderPane();
            Scene scene = new Scene(root, 400, 400);

            Group group = new Group();

            Circle circle = new Circle(60);
            circle.setCenterX(70);
            circle.setCenterY(70);

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

            group.getChildren().add(circle);

            root.setCenter(group);

            Spinner<Integer> spinnerR = new Spinner<>(0, 255, 100);
            Spinner<Integer> spinnerG = new Spinner<>(0, 255, 100);
            Spinner<Integer> spinnerB = new Spinner<>(0, 255, 100);

            r.bind(spinnerR.valueProperty());
            g.bind(spinnerG.valueProperty());
            b.bind(spinnerB.valueProperty());

            root.setBottom(new HBox(spinnerR, spinnerG, spinnerB));

            primaryStage.setScene(scene);
            primaryStage.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Note: It is the same with DoubleProperty .

private DoubleProperty r = new SimpleDoubleProperty(0);
private DoubleProperty g = new SimpleDoubleProperty(0);
private DoubleProperty b = new SimpleDoubleProperty(0);

circle.fillProperty().bind(Bindings.createObjectBinding(() -> Color.rgb(r.getValue().intValue(), g.getValue().intValue(), b.getValue().intValue()), r, g, b));

You can do

DoubleProperty red = new SimpleDoubleProperty();
red.bind(Bindings.createDoubleBinding( () ->
    ((Color)circle.getFill()).getRed(),
    circle.fillProperty()));

and similarly for green and blue.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM