Javafx 8 ListView如何在列表中没有项目时显示行

时间:2017-10-30 16:31:01

标签: listview javafx-8

我有一个listview,当我没有项目时,我想显示行。我是否真的必须添加null一次,当添加一个项目时删除该null或是否还有其他可能性?

2 个答案:

答案 0 :(得分:0)

这就是我所拥有的(我可以添加占位符,但我不会这样做) empty list now

这就是我想要的 empty list with rows shown

答案 1 :(得分:0)

我通过一个空的ListView并用占位符作为主占位符的其他样式解决了这个问题。

这样,您可以避免弄乱ListView的项目。

创建与此类似的类(该类在Kotlin中):

class ListViewPlaceholder: ListView<Any?>() {
    init {
        style = "-fx-background-insets: 0; -fx-padding: 0;"
        items.add(null)
        cellFactory = Callback<ListView<Any?>?, ListCell<Any?>?> {
            object : ListCell<Any?>() {
                override fun updateItem(item: Any?, empty: Boolean) {
                    super.updateItem(item, true)
                }
            }
        }
    }
}

背景插图 padding 设置为0-它将删除占位符ListView的边框,以便准确呈现主ListView的位置(已经有自己的边框)。 / p>

null添加到列表中。

设置新的单元格工厂,并使用覆盖的ListCell方法返回一个updateItem,在此方法中,您以true作为第二个参数来调用超级方法。 这是必需的,列表中的第一个项目看起来像一个空单元格,而不是一个包含空项目的单元格。

然后您可以像下面这样在fxml中使用它:

<ListView fx:id="mainListView">
    <placeholder>
        <ListViewPlaceholder/>
    </placeholder>
</ListView>

或在代码中

mainListView.placeholder = ListViewPlaceholder()

具有这种样式

.list-cell {
    -fx-border-color: red;
    -fx-border-insets: 2;
}

.list-cell:empty {
    -fx-border-color: orange;
}

结果看起来像这样

主ListView为空-显示占位符:

no items

主ListView有一项:

one item