Javafx Tableview 如何为具有特定值的单元格着色

Javafx Tableview How To Color Cells with Specific Value

有没有办法只为某些具有特定值 a TableView 的单元格着色?

Callback<TableColumn, TableCell> historyTableCellFactory
    = new Callback<TableColumn, TableCell>() {
        public TableCell call(TableColumn p) {
            TableCell newCell = new TableCell<CustomerHistoryStructure, String>() {
                private Text newText;

                @Override
                public void updateItem(String items, boolean empty) {
                    super.updateItem(items, empty);

                    if (!isEmpty()) {
                        newText = new Text(items.toString());
                        newText.setWrappingWidth(140);
                        this.setStyle("-fx-background-color:#e50000 ;");
                        setGraphic(newText);
                    }
                }

                private String getString() {
                    return getItem() == null ? "" : getItem().toString();
                }
            };
            return newCell;
        }
    };

上面代码的问题是,当程序是 运行 并且我在 TableView 上滚动时,其他单元格会自行着色。

该代码的问题在于您永远不会撤消添加项目时所做的更改。您永远不会删除 graphic,即使单元格变空并且您永远不会检查特定值。此外,如果您添加 null 项,items.toString() 可能会导致 NPE。也不需要重新创建 Text 元素。此外,您永远不会将项目与特定值进行比较。

final String specificValue = ...

new TableCell<CustomerHistoryStructure, String>() {
    private final Text newText;

    {
         newText = new Text();
         newText.setWrappingWidth(140);
    }

    @Override
    public void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);

        if (empty) {
            setGraphic(null);
            setStyle("");
        } else {
            newText.setText(getString());
            setGraphic(newText);

            // adjust style depending on equality of item and specificValue
            setStyle(Objects.equals(item, specificValue) ? "-fx-background-color:#e50000 ;" : "");
        }
    }

    private String getString() {
        return getItem() == null ? "" : getItem().toString();
    }
};