我有一个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
的想法。所以我尝试了很多方法来获取返回
CallBack
的TableCell
在我看到@Sedrick的答案之后。
我发现我可以发送lambda实现,例如:
setCellFactory(e -> new CustomCell())
。感谢@Sedrick和@kleopatra。