首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Bindings.bindContent?

如何使用Bindings.bindContent?
EN

Stack Overflow用户
提问于 2017-03-31 22:24:48
回答 2查看 435关注 0票数 0

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

代码语言:javascript
复制
    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,并在多边形点启动时手动更改多边形点,它就能工作。

代码语言:javascript
复制
    trianglePoints.addListener((InvalidationListener)(listener) -> triangle.getPoints().setAll(trianglePoints.get()));

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-31 23:11:28

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

代码语言:javascript
复制
Bindings.bindContent(triangle.getPoints(), trianglePoints);

您以前的绑定无法工作,因为trianglePoints.get()只是computeValue()调用的结果,即创建ObservableList时根据初始widthheight计算的一些值。因此,没有考虑到对widthheight属性的进一步更改。

票数 2
EN

Stack Overflow用户

发布于 2017-04-01 08:55:59

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

代码语言:javascript
复制
@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();
}

此外,还可以使用比例尺属性(除非使用笔画或异国情调填充)来完成此操作:

代码语言:javascript
复制
@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();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43150542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档