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);
}
}
}
我不确定我是否遗漏了什么,是否是错误/不受支持。我正在尝试使用 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);
}
}
}