【问题标题】:Binding to a shape fillProperty JavaFX绑定到形状 fillProperty JavaFX
【发布时间】:2016-12-06 10:12:24
【问题描述】:

如何在 JavaFX 中将三个 doubleProperty Red、Green 和 Blue 绑定到“circle.fillProperty()”?

例如,我可以轻松地将圆的 radiusProperty 绑定到 doubleProperty,如下所示:

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

【问题讨论】:

    标签: java javafx data-binding


    【解决方案1】:

    您可以使用Bindings.createObjectBinding

    CirclefillProperty 的类型是ObjectProperty<Paint>,所以你必须在绑定中创建一个Paint 对象:

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

    这是一个完整的例子:

    本例使用Spinners作为输入控件,注意这些控件的valueProperty可以直接作为绑定的依赖。

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

    注意: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));
    

    【讨论】:

      【解决方案2】:

      你可以的

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

      同样适用于绿色和蓝色。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-15
        • 1970-01-01
        • 2017-04-11
        相关资源
        最近更新 更多