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

JavaFX:使组件高度适应其子级高度?,javafx,height,components,children,Javafx,Height,Components,Children,我正在尝试使用javaFX(2.2)开发一个桌面应用程序,但我遇到了一些困难,无法让它像我希望的那样运行。作为该框架的新用户,我可能不会像应该的那样使用它 我想要的是一种dashbord,在滚动窗格中有几个JavaFX或自定义控件。我目前有几个视图如下所示: <AnchorPane id="userContent" xmlns:fx="http://javafx.com/fxml" fx:controller="squalp.view.OrgViewController">

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

我想要的是一种dashbord,在滚动窗格中有几个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>
但我找不到一种方法来跟踪树视图上显示的项目

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

提前谢谢


编辑:问题的视觉描述:

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

如果扩展我的treeview的项目,现在它们太多了。虽然我已经有了一个滚动窗格的可滚动视图,但它们并不是一次全部可见,treeview的滚动条也会出现

我希望我的TreeView能够适应它的内容高度(如果项目被折叠,高度会降低,如果项目被扩展,高度会增加),以便能够一个接一个地放置多个组件,并使用ScrollPane的滚动条滚动所有组件


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

您可以使用视图的binding属性到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*/    
    }
});
pane.heightProperty().addListener(新的ChangeListener()){
@凌驾

public void changed(可观察值实现您的目标可能有一个合适的方法,但我可以建议使用与tableview类似的方法

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

请注意,这只是一个使用不推荐的内部仅供使用方法的变通方法,在未来的版本中可能会删除该方法。

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

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

那么,您希望tableview和treeview在没有垂直滚动条的情况下显示其内容吗?不,我的目标不是隐藏滚动条,而是将视图高度绑定到其内容高度(基本上是单元格高度的总和)。对问题的直观描述会更有帮助。请更具体地说明您的问题,例如哪个节点在这种情况下,是否要调整/扩展大小也会有帮助。好的!我编辑了我的帖子:试图更具体地说明问题,并添加了一些视觉信息。谢谢你的回答。将节点调整为其窗格尺寸确实很有用。但因为我希望使用滚动窗格作为“根”布局,我不想让节点适应布局,而是展开它们以查看它们的所有可视内容,即使这会导致节点比滚动窗格大。
treeView.expandedItemCountProperty().addListener((obs, oldV, newV) -> {
    Platform.runLater(() -> {
        treeView.setPrefHeight(newV.intValue() * cellHeight);
    });
});