JavaFX:使组件高度适应其子高度?

时间:2014-03-13 09:05:36

标签: javafx height components children

我正在尝试使用javaFX(2.2)开发一个桌面应用程序,我遇到了一些困难,让它真的像我希望的那样行事。作为框架的新用户,我可能不会使用它,因为它应该是......

我想要的是一种dashbord,在ScrollPane中有几个JavaFX或自定义控件。我目前有几个看法如下:

<AnchorPane id="userContent" xmlns:fx="http://javafx.com/fxml" fx:controller="squalp.view.OrgViewController">
    <children>
        <ScrollPane fx:id="scrollPane" styleClass="transparent" hbarPolicy="NEVER" vbarPolicy="AS_NEEDED" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
            <content>
                <VBox fx:id="vBox" styleClass="transparent" alignment="TOP_LEFT" focusTraversable="true">
                    <children>
                        <Label text="Label" />
                        <Button fx:id="bTest" text="Test" onAction="#test"/>
                        <TreeView fx:id="orgTree" focusTraversable="true" />
                    </children>
                </VBox>
            </content>
        </ScrollPane>
    </children>     
</AnchorPane>

只要我继续使用简单的控件,没问题,就可以在VBox中一个接一个地正确放置物品。

但是当使用TreeViews或TableViews时,我只能让我的控件具有固定高度,这意味着底部有额外的空间,或者除了主滚动条之外还有新的滚动条。我想要实现的是使我的控件适应他们当前的内容高度。

Qt的QML,例如,有一个childrenHeight属性,这就是我正在寻找的东西。我认为这个内容高度必须以某种方式计算,因为组件滚动条确实适应了内容。

我不得不使用tableviews的解决方法:

table.setPrefHeight(list.size() * rowHeight + headerHeight);

但我找不到跟踪树视图中显示项目的方法。

有谁知道我可以做些什么来处理这个问题?或者我真的没有按照我应该使用的框架?

提前致谢。

编辑:问题的直观描述:

Case 1

这里我的treeview的高度设置为默认值。没有足够的项目来填充树视图:如果我想在下面放置另一个组件,那么就会有差距;如果我的场景不够大,即使所有可显示的内容都可见,ScrollPane的滚动条也会出现。

Case 2

如果展开我的treeview的项目,现在有太多了。它们不是一次全部可见,并且树形视图的滚动条出现,即使我已经有一个带滚动窗格的可滚动视图。

我想要的是我的TreeView适应其内容高度(如果项目被折叠则减小高度,如果它们被展开则增加高度),以便能够一个接一个地放置几个组件并滚动它们所有使用ScrollPane的滚动条。

由于TreeView组件本身就是一个滚动条,因此必须在某个时刻计算其可见内容的高度(因为滚动条基本上使用基于contentHeight / componentHeight的比率)。这个信息似乎在公共API中不可用,但我想知道,如果开发一个扩展TreeView的自定义类,可能有办法将我的组件绑定到它的“可见高度”。

3 个答案:

答案 0 :(得分:1)

可能有一种正确的方法来实现你的目标,但我可以建议类似于tableview的方法。

orgTree.prefHeightProperty().bind(orgTree.impl_treeItemCountProperty()
        .multiply(treeRowHeight)); // treeRowHeight maybe 24.

请注意,这只是一种解决方法,其中使用了不推荐使用的内部使用方法,可能会在将来的版本中将其删除。

答案 1 :(得分:0)

您可以将视图的绑定属性用于childs height属性。这样,每当父级的高度发生变化时,孩子的身高就会自动改变!这不是你想要的自动高度适应,而是强制适应,这对你有所帮助!

宽度属性也可用

基本上这是一个可以帮助你的片段:

pane.heightProperty().addListener(new ChangeListener<Number>() {
    @Override
    public void changed(ObservableValue<? extends Number> arg0,
                                 Number oldValue, Number newValue) {
        table.setPrefHeight(newValue - 200);/*The difference of height between 
                                             parent and child to be maintained*/    
    }
});

答案 2 :(得分:0)

我一直在寻找使TreeView自动调整大小以适合其内容的方法,例如当节点展开或折叠时。这就是我最终要做的。请注意, Platform.runLater()是必需的,因此简单的属性绑定在这里不起作用。另请注意, cellHeight 是树节点的高度。如何获得它超出了这里的问题范围。

treeView.expandedItemCountProperty().addListener((obs, oldV, newV) -> {
    Platform.runLater(() -> {
        treeView.setPrefHeight(newV.intValue() * cellHeight);
    });
});