我的程序正在根据内容更改ListCell
个样式:
debugListView.setCellFactory(listCell -> new ListCell<String>() {
@Override
public void updateItem(String content, boolean isEmpty) {
super.updateItem(content, isEmpty);
if (isEmpty || content == null) {
setText("");
setStyle("");
} else {
setText(content);
if (content.contains("INFO")) {
getStyleClass().addAll("info", "debug");
} else if (content.contains("WARN")) {
getStyleClass().addAll("warning", "debug");
} else if (content.contains("ERROR")) {
getStyleClass().addAll("error", "debug");
}
}
}
});
这很有效,但是如果滚动列表,样式就会搞砸了。我读到了在滚动时如何管理ListCells
中的ListView
,并且每次都会销毁它们并重新创建这可能是问题(https://stackoverflow.com/a/12425646/4469105)。类似于TableView
排序问题,其中TableCell
样式在对列进行排序时会搞乱,这些列似乎已通过8u60(https://stackoverflow.com/a/11066040/4469105)修复。
尽管如此,我发现这个没有解决方法。那么有人有想法或一些关键词吗?
提前谢谢!
答案 0 :(得分:2)
问题出现是因为样式类实现为List
,允许重复输入。因此,当用户滚动,导致调用updateItem(...)
时,您将向单元格的样式类列表添加越来越多的条目,而不会删除它们。
在实现逻辑之前删除所有正在使用的特定样式类:
List<String> allStyles = Arrays.asList("info", "debug", "warning", "error");
debugListView.setCellFactory(listCell -> new ListCell<String>() {
@Override
public void updateItem(String content, boolean isEmpty) {
super.updateItem(content, isEmpty);
getStyleClass().removeAll(allStyles);
if (isEmpty || content == null) {
setText("");
setStyle("");
} else {
setText(content);
if (content.contains("INFO")) {
getStyleClass().addAll("info", "debug");
} else if (content.contains("WARN")) {
getStyleClass().addAll("warning", "debug");
} else if (content.contains("ERROR")) {
getStyleClass().addAll("error", "debug");
}
}
}
});