我有一个多边形,我希望在调整窗口大小时增大它的大小。我有一个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()));
我做错了什么?
答案 0 :(得分:1)
您应该按照以下方式更改绑定:
trianglePoints.get()
您之前的绑定无效,因为computeValue()
只是ObservableList
调用的结果,即创建width
并在初始height
和width
时计算一些值。因此,未考虑对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();
}