我正在尝试使用javaFX(2.2)开发桌面应用程序,并且在使其真正发挥自己的作用时遇到了一些困难。作为该框架的新用户,我可能未按预期使用它。
我想要的是一种dashbord,在ScrollPane中具有多个JavaFX或自定义控件。我目前有几个看起来像这样的 View :
<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属性,这正是我想要的。我认为必须以某种方式计算此内容的高度,因为组件滚动条确实可以适应内容。
我不得不对表 View 使用一种解决方法:
table.setPrefHeight(list.size() * rowHeight + headerHeight);
但我找不到跟踪树 View 上显示项目的方法。
有谁知道我该怎么做才能解决这个问题?还是我真的没有像应该那样使用框架?
提前致谢。
编辑:问题的直观描述:
Case 1
在这里,我的树 View 的高度设置为默认值。没有足够的项目来填充树 View :如果我想在下面放置另一个组件,将会有一个空白;如果我的场景不够大,即使所有可显示的内容都是可见的,也会出现ScrollPane的滚动条。
Case 2
如果要展开我的树状 View 的项目,那么现在有太多了。尽管我已经有了一个带有滚动窗格的可滚动 View ,但它们并不能一次全部可见,并且会显示treeview的滚动条。
我想让我的TreeView适应其内容高度(如果折叠,则减小高度,如果展开,则增大高度),以便能够一个接一个地放置多个组件,并使用ScrollPane滚动它们。滚动条。
由于TreeView组件本身具有滚动条,因此必须在某个点计算其可见内容的高度(因为滚动条基本上使用基于contentHeight / componentHeight的比率)。该信息似乎在 public API中不可用,但我想知道是否是否要开发一个扩展TreeView的自定义类,是否可以将组件绑定(bind)到其“可见高度”。
最佳答案
也许有适当的方法可以实现您的目标,但是我可以建议使用类似于tableview的方法。
orgTree.prefHeightProperty().bind(orgTree.impl_treeItemCountProperty()
.multiply(treeRowHeight)); // treeRowHeight maybe 24.
请注意,这只是使用不建议使用的内部仅供使用的方法的一种解决方法,该方法可能会在将来的版本中删除。