JavaFX自动调整大小组

时间:2016-12-08 14:42:29

标签: user-interface dynamic javafx javafx-8 autoresize

我有一个相当复杂的场景图,这让我有了一些调整大小的问题。如果你能帮助我解决它,我会很高兴的。

我的根节点是BorderPane,其中心填充了ListViewListView的每个单元格都填充了自定义的缩放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类以某种方式避免手动绑定的需要,但实际上不知道该怎么做。

对此的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以检测属性是否已绑定,然后在操作之前取消绑定:

if (content.prefWidthProperty().isBound()) {
    content.prefWidthProperty().unbind();
}
...

据推测,当您放大图表并调整窗口大小时,内容已经大于视口,因此宽度的强制更改不应该启动,直到窗口调整大小超出放大的大小图表?

鉴于您拥有的条件不同,您可能最好监控BorderPane / ListView的大小,并在更改时调整需要它的图表的大小。