Javafx Tableview如何为具有特定价值的细胞着色

时间:2016-08-27 15:30:21

标签: css tableview javafx-8 tableviewcell tablecell

有没有办法只为某些特定值为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时,其他单元格会自行着色。

1 个答案:

答案 0 :(得分:1)

该代码的问题在于您永远不会撤消添加项目时所做的更改。您永远不会删除graphic,即使单元格变空并且您从不检查特定值。如果添加items.toString()项,null可能会导致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();
    }
};