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