我有一个相当复杂的场景图,这让我有了一些调整大小的问题。如果你能帮助我解决它,我会很高兴的。
我的根节点是BorderPane
,其中心填充了ListView
。 ListView
的每个单元格都填充了自定义的缩放ScrollPane
,如下所示:
public class ZoomableScrollPane extends ScrollPane {
Group zoomGroup;
Scale scaleTransform;
LineChart<Number , Number> content;
double scaleValue = 1.0;
double delta = 0.1;
public ZoomableScrollPane(LineChart<Number , Number> content, double height) {
this.content = content;
this.setPrefHeight(height);
Group contentGroup = new Group();
zoomGroup = new Group();
contentGroup.getChildren().add(zoomGroup);
zoomGroup.getChildren().add(content);
setContent(contentGroup);
scaleTransform = new Scale(scaleValue, scaleValue, 0, 0);
zoomGroup.getTransforms().add(scaleTransform);
}
}
正如您所看到的,每个LineChart
内都有一个ZoomableScrollPane
。我想用这张图表做两件事。首先,以某种方式将其宽度与根布局绑定,以便在调整窗口大小的情况下获得所需的结果(不缩放,缩放是正常的),其次是在按下按钮时在运行时更改图表的宽度:
public void handleButton(ActionEvent actionEvent) {
MainController.lineChart1.setPrefWidth(MainController.lineChart1.getPrefWidth() + CONSTANT);
}
问题在于我面临冲突。因为LineChart
是群组(不是窗格)的孩子,我只知道一种可退款方式,手动绑定其宽度 root BorderPane
是这样的:
MainController.lineChart1.prefWidthProperty().bind(fourChannels.widthProperty().subtract(40));
在这种情况下,我无法在运行时更改LineChart
的宽度,并且会获得A bound value cannot be set
例外。
我想一个解决方案可能是修改ZoomableScrollPane
类以某种方式避免手动绑定的需要,但实际上不知道该怎么做。
对此的任何帮助将不胜感激。
答案 0 :(得分:0)
您可以检测属性是否已绑定,然后在操作之前取消绑定:
if (content.prefWidthProperty().isBound()) {
content.prefWidthProperty().unbind();
}
...
据推测,当您放大图表并调整窗口大小时,内容已经大于视口,因此宽度的强制更改不应该启动,直到窗口调整大小超出放大的大小图表?
鉴于您拥有的条件不同,您可能最好监控BorderPane / ListView的大小,并在更改时调整需要它的图表的大小。