如果我创建了一个ListView:
new ListView<>(FXCollections.observableArrayList("1", "2", "3"))
我希望它创建一个有3行的ListView。但事实并非如此,它创建了一个大约有17行的ListView。有没有一种方法可以告诉ListView始终是高度,这样无论其中的项目是什么,都会显示出来,但没有空行?
让它自动宽度也会很有用,所以它总是和最宽的一行一样宽。
这样做的一个目的是可以在ScrollPane中使用它。我知道它有自己的滚动条,但它们没有提供足够的控制。
发布于 2014-01-28 22:33:00
我刚刚发现Paul Marshall的答案可以简化为一行代码,使用Bindings.size创建一个表示ObservableList大小的数值型jfx属性:
listView.prefHeightProperty().bind(Bindings.size(itemListProperty).multiply(LIST_CELL_HEIGHT));
遗憾的是,列表单元格的高度必须仍然是硬编码的AFAIK。
发布于 2013-07-04 03:26:46
不幸的是,我们没有一个很好的、干净的ObservableList属性来绑定。相反,通过在列表中添加一个ListChangeListener是可行的,至少我过去是这样做的。默认情况下,每行的大小应该是24px,并且我们需要在顶部和底部为ListView的边缘增加一个像素。否则,我们仍然会显示ListView的滚动条。首先,我们将创建ObservableList和ListView,并设置ListView的初始高度:
/*
* Each row in a ListView should be 24px tall. Also, we have to add an extra
* two px to account for the borders of the ListView.
*/
final int ROW_HEIGHT = 24;
final ObservableList items = FXCollections.observableArrayList("1", "2", "3");
final ListView list = new ListView(items);
// This sets the initial height of the ListView:
list.setPrefHeight(items().size() * ROW_HEIGHT + 2);
现在,我们必须向ObservableList添加一个ListChangeListener。当列表更改时,我们只需更改ListView的设置高度以匹配新的行数。如果我们知道我们永远不会在支持ListView的ObservableList中添加或删除项,那么我们可以排除侦听器。同样,高度是行数乘以每行的高度加上边框的两个额外像素:
/*
* This listener will resize the ListView when items are added or removed
* from the ObservableList that is backing the ListView:
*/
items.addListener(new ListChangeListener() {
@Override
public void onChanger(ListChangeListener.Change change) {
list.setPrefHeight(items.size() * ROW_HEIGHT + 2);
}
});
参考文献:JavaFX ListView Documentation,JavaFX ObservableList Documentation
发布于 2013-12-30 06:50:46
你在搜索这个吗:
.list-cell:empty {
-fx-opacity: 0;
}
这将隐藏空单元格的。
https://stackoverflow.com/questions/17429508
复制相似问题