如何让JavaFX ListView成为其项目的高度?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (36)

如果我创建一个ListView:

new ListView<>(FXCollections.observableArrayList("1", "2", "3"))

我期望它创建一个3行的ListView。但事实并非如此。它创建了17行左右的ListView。有没有办法告诉ListView始终是这样的高度:无论哪个项目总是显示,但没有空行?

拥有它的自动宽度也是有用的,所以它总是和最宽的行一样宽。

这样做的一个目的就是它可以在ScrollPane中使用。我知道它有自己的滚动条,但它们不提供足够的控制。

提问于
用户回答回答于

我刚刚发现Paul Marshall的答案可以通过Bindings.size缩减为一行,创建一个表示ObservableList大小的数字jfx属性:

listView.prefHeightProperty().bind(Bindings.size(itemListProperty).multiply(LIST_CELL_HEIGHT));

用户回答回答于

不幸的是,没有一个很好的,干净的大小的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);

现在我们必须添加一个ListChangeListener给ObservableList。当列表更改时,我们只需更改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文档JavaFX ObservableList文档

扫码关注云+社区