我如何使用Bindings.bindContent?

时间:2017-03-31 22:24:48

标签: java javafx

我有一个多边形,我希望在调整窗口大小时增大它的大小。我有一个DoubleBinding,它是场景中所有形状大小的基线。我使用这个DoubleBinding创建一个ListBinding来计算多边形应该有多大。我尝试使用Bindings.bindContent(list1,list2)将ListBinding绑定到多边形的点,但它似乎不起作用。

    Polygon triangle = new Polygon();

    ListBinding<Double> trianglePoints = new ListBinding<Double>() {
        {
            super.bind(width, height);
        }
        @Override
        protected ObservableList<Double> computeValue() {
            ObservableList<Double> points = FXCollections.observableArrayList();
            points.addAll(0.0, 0.0, width.get()/2, height.get()/4, 0.0, height.get()/2);
            return points;
        }
    };
    Bindings.bindContent(triangle.getPoints(), trianglePoints.get());

我发现如果我向三角形点添加一个InvalidationListener并在它触发时手动更改多边形点,它就会起作用。

    trianglePoints.addListener((InvalidationListener)(listener) -> triangle.getPoints().setAll(trianglePoints.get()));

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您应该按照以下方式更改绑定:

trianglePoints.get()

您之前的绑定无效,因为computeValue()只是ObservableList调用的结果,即创建width并在初始heightwidth时计算一些值。因此,未考虑对height和{{1}}属性的进一步更改。

答案 1 :(得分:1)

我建议不要使用ListBinding。您不需要一遍又一遍地重新创建列表,只需要修改一些要点:

@Override
public void start(Stage primaryStage) {
    Polygon triangle = new Polygon(
            0, 0,
            0, 0,
            0, 0);

    StackPane root = new StackPane();
    root.getChildren().add(triangle);

    root.heightProperty().addListener((observable, oldH, newH) -> {
        double h = newH.doubleValue();
        triangle.getPoints().set(3, h / 4);
        triangle.getPoints().set(5, h / 2);
    });

    root.widthProperty().addListener((observable, oldW, newW) -> {
        double w = newW.doubleValue();
        triangle.getPoints().set(2, w / 2);
    });

    Scene scene = new Scene(root);

    primaryStage.setScene(scene);
    primaryStage.show();
}

此外,还可以使用缩放属性(除非您使用笔划或一些异国情调填充)来执行此操作:

@Override
public void start(Stage primaryStage) {
    Polygon triangle = new Polygon(
            0, 0,
            0.5, 0.25,
            0, 0.5);

    StackPane root = new StackPane();
    root.getChildren().add(triangle);

    triangle.scaleXProperty().bind(root.widthProperty());
    triangle.scaleYProperty().bind(root.heightProperty());

    Scene scene = new Scene(root);

    primaryStage.setScene(scene);
    primaryStage.show();
}