我正在尝试使用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);
但我找不到跟踪树视图中显示项目的方法。
有谁知道我可以做些什么来处理这个问题?或者我真的没有按照我应该使用的框架?
提前致谢。
编辑:问题的直观描述:
这里我的treeview的高度设置为默认值。没有足够的项目来填充树视图:如果我想在下面放置另一个组件,那么就会有差距;如果我的场景不够大,即使所有可显示的内容都可见,ScrollPane的滚动条也会出现。
如果展开我的treeview的项目,现在有太多了。它们不是一次全部可见,并且树形视图的滚动条出现,即使我已经有一个带滚动窗格的可滚动视图。
我想要的是我的TreeView适应其内容高度(如果项目被折叠则减小高度,如果它们被展开则增加高度),以便能够一个接一个地放置几个组件并滚动它们所有使用ScrollPane的滚动条。
由于TreeView组件本身就是一个滚动条,因此必须在某个时刻计算其可见内容的高度(因为滚动条基本上使用基于contentHeight / componentHeight的比率)。这个信息似乎在公共API中不可用,但我想知道,如果开发一个扩展TreeView的自定义类,可能有办法将我的组件绑定到它的“可见高度”。
答案 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);
});
});