JavaFX TreeView cellFactory 样式错误

JavaFX TreeView cellFactory styling bug

我不确定我是否遗漏了什么,是否是错误/不受支持。我正在尝试使用 updateItem-Method 设置树项的背景颜色。但是当我四处滚动时,其他树项也会变色。

这是重现问题的代码:

public class Main extends Application
{

    public static void main(String[] args)
    {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception
    {
        StackPane root = new StackPane();
        TreeView<String> treeView = new TreeView<String>(getTree());

        treeView.setCellFactory(tv -> new TreeCell<String>()
        {
            @Override
            protected void updateItem(String item, boolean empty)
            {
                super.updateItem(item, empty);

                if (item != null)
                {
                    setText(item);

                    if (item.equals("c5"))
                    {
                        setStyle("-fx-background-color: YELLOW");
                    }

                }
            }
        });

        root.getChildren().add(treeView);

        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }

    private TreeItem<String> getTree()
    {
        TreeItem<String> root = new TreeItem<>("root");
        TreeItem<String> a = new TreeItem<String>("a");
        TreeItem<String> b = new TreeItem<String>("b");
        TreeItem<String> c = new TreeItem<String>("c");

        root.getChildren().add(a);
        root.getChildren().add(b);
        root.getChildren().add(c);

        for (int i = 0; i < 100; i++)
        {
            c.getChildren().add(new TreeItem<String>("c" + i));
        }

        return root;
    }
}

示例输出:

您忘记撤消样式,以防 TreeCell 被清空或项目被替换为不应设置为黄色的项目。如果单元格变空或包含 null 项,您也不会删除文本:

@Override
protected void updateItem(String item, boolean empty) {
    super.updateItem(item, empty);
    if (empty || item == null) {
        setText(null);
        // clear background
        setStyle(null);
    } else {
        setText(item);
        if (item.equals("c5")) {
            setStyle("-fx-background-color: YELLOW");
        } else {
            // clear background
            setStyle(null);
        }
    }
}