我有一个TableColumn:

TableColumn<Foo, String> colStatus = new TableColumn("Status");
colStatus.setCellValueFactory(new PropertyValueFactory<>("statusElement"));


在此表上,我要应用此cellFactory TextFieldTableCell.forTableColumn(),它将使单元格可编辑。

但我也想将此与定制的cellFactory结合起来:

colStatus.setCellFactory(new Callback<>() {

    public TableCell<Foo, String> call(TableColumn param) {

        return new TableCell<>() {

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

                super.updateItem(item, empty);

                if (!isEmpty()){

                    if(item.equals("error")){

                        this.setTextFill(Color.RED);
                        setText(item);

                    }else{

                        this.setTextFill(Color.Black);
                        setText(item);

                    }

                }

            }
        };
    }

});


此单元格工厂根据单元格值设置单元格的文本颜色。

但是我不知道如何根据值来使单元格可编辑,也不能自定义其颜色。

这是MCVE:

@Override
public void start(Stage primaryStage){

    List<String> test = new ArrayList<>();
    test.add("done(green)");
    test.add("done(green)");
    test.add("fail(red)");
    test.add("done(green)");

    TableView<String> tableView = new TableView<>();
    tableView.setColumnResizePolicy(TableView.UNCONSTRAINED_RESIZE_POLICY);
    tableView.setEditable(true);

    TableColumn<String, String> col = new TableColumn<>("Column");
    col.setCellValueFactory(data -> new SimpleStringProperty(data.getValue()));
    col.setCellFactory(TextFieldTableCell.forTableColumn());
    //I want to apply a color based by value from cell

    tableView.getColumns().add(col);

    tableView.setItems(FXCollections.observableArrayList(test));

    primaryStage.setScene(new Scene(tableView));

    primaryStage.show();

}

最佳答案

我终于发现可以将TextFieldTableCell.forTableColumn()用于自定义。

只需覆盖TextFieldTableCell

private static class CustomCell extends TextFieldTableCell<String, String>{

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

        super.updateItem(item, empty);

        if(item == null || empty) {
            setText(null);
            return;
        }

        if(!isEmpty()){

            if(item.equals("error")){

                this.setTextFill(Color.RED);
                setText(item);

            }else{

                this.setTextFill(Color.BLACK);
                setText(item);

            }

        }

    }

}


我被固定为setCellFactory作为参数CallBack的想法。

所以我尝试了很多方法来获取返回CallBackTableCell

在我看到@Sedrick的答案之后。

我发现我可以发送lambda实现,例如:setCellFactory(e -> new CustomCell())

感谢@Sedrick和@kleopatra。

09-05 10:20