ListView设置虚拟行高度

ListView设置虚拟行高度,listview,javafx,Listview,Javafx,一个小的图形麻烦,但我有一个ListView设置来显示自定义对象,设置的高度比默认值高。我尝试使用setFixedCellSize(),它在大多数情况下都能很好地工作,但在一种情况下,某些单元格的单元格高度可能会根据用户交互而增减 class Example extends Label { private boolean change = true; public Example(String text) { super(text); setMin

一个小的图形麻烦,但我有一个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"));
类示例扩展标签{
私有布尔更改=true;
公共示例(字符串文本){
超级(文本);
设置最小高度(150);
设置高度(150);
设置最大高度(150);
超链接=新的超链接(“更改”);
设置图形(链接);
链接设置动作(ae->{
改变=!改变;
如果(更改){
设置最小高度(80);
设置高度(80);
设置最大高度(80);
}否则{
设置最小高度(180);
高度(180);
设置最大高度(180);
}
});
}
}
ListView列表=新建ListView();
列表。设置固定单元大小(150);
list.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
list.getItems().addAll(新示例(“Hello world”)、新示例(“12345”);

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

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

ListView lv=new ListView();
lv.setCellFactory(lst->
新ListCell(){
@凌驾
受保护的void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
if(空){
设置高度(45.0);
setText(空);
}否则{
setPrefHeight(区域。使用计算的大小);
setText(项目);
}
}
});
lv.getItems().addAll(“你好”,“世界”);
这将导致非空单元格具有其首选大小(根据内容,在本例中仅为字符串),而空单元格的首选大小为45


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

ListView lv=new ListView();
lv.setCellFactory(lst->
新ListCell(){
@凌驾
受保护的void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
if(空){
设置高度(45.0);
setText(空);
}否则{
setPrefHeight(区域。使用计算的大小);
setText(项目);
}
}
});
lv.getItems().addAll(“你好”,“世界”);
这将导致非空单元格具有其首选大小(根据内容,在本例中仅为字符串),而空单元格的首选大小为45

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");