滚动ListView会破坏ListCell样式

时间:2015-08-15 12:59:34

标签: java css listview javafx

我的程序正在根据内容更改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)修复。

尽管如此,我发现这个没有解决方法。那么有人有想法或一些关键词吗?

提前谢谢!

1 个答案:

答案 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");
            }
        }
    }
});