ListView设置虚拟行高度

Mat*_*ght 1 listview javafx

轻微的图形烦恼,但我设置了ListView来显示自定义对象,这些对象的设置高度大于默认值。我尝试使用setFixedCellSize()在大多数情况下都能正常使用的方法,但在某些情况下,某些单元的单元高度可能会根据用户的交互作用而增大和缩小。

class Example extends Label {
    private boolean change = true;
    public Example(String text) {
        super(text);
        setMinHeight(150);
        setPrefHeight(150);
        setMaxHeight(150);
        Hyperlink link = new Hyperlink("Change");
        setGraphic(link);
        link.setOnAction(ae -> {
            change = !change;
            if(change) {
                setMinHeight(80);
                setPrefHeight(80);
                setMaxHeight(80);
            } else {
                setMinHeight(180);
                setPrefHeight(180);
                setMaxHeight(180);
            }
        });
    }
}

ListView<Node> list = new ListView<>();
list.setFixedCellSize(150);
list.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
list.getItems().addAll(new Example("Hello world"), new Example("12345"));
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,单击超链接时,标签会更改高度。setFixedCellSize()添加时不再执行此操作。是否有另一种方法可以实现更改虚拟行的相同效果,但允许自定义节点更改高度?

Ita*_*tai 5

您可以设置一个自定义单元格工厂,该工厂根据单元格的状态设置所需的高度(我假设“虚拟单元格”是指空单元格):

ListView<String> lv = new ListView<>();
lv.setCellFactory(lst ->
        new ListCell<String>() {
            @Override
            protected void updateItem(String item, boolean empty) {
                super.updateItem(item, empty);
                if (empty) {
                    setPrefHeight(45.0);
                    setText(null);
                } else {
                    setPrefHeight(Region.USE_COMPUTED_SIZE);
                    setText(item);
                }
            }
        });
lv.getItems().addAll("Hello", "World");
Run Code Online (Sandbox Code Playgroud)

这将导致非空单元格具有其首选大小(根据内容,在这种情况下,它只是字符串),而空单元格将具有其首选大小为45。

插图