Вместо IntegerProperty
используйте ObjectProperty<Shape>
и @Override
в TableCell
updateItem(item,empty)
методе для отображения формы
Вот рабочий код:
public class Controller implements Initializable {
@FXML
private TableView<Model> tableView;
@FXML
private TableColumn<Model, Shape> shapeColumn;
@FXML
private TableColumn<Model, String> textColumn;
@Override
public void initialize(URL location, ResourceBundle resources) {
shapeColumn.setCellValueFactory(data -> data.getValue().shapeProperty());
textColumn.setCellValueFactory(data -> data.getValue().textProperty());
shapeColumn.setCellFactory(cell -> new ShapeTableCell());
ObservableList<Model> items = FXCollections.observableArrayList();
items.add(new Model(new Circle(10), "Circle"));
items.add(new Model(new Rectangle(20, 20), "Rectangle"));
tableView.setItems(items);
}
private class Model {
// Instead of shape you can use anything, which inherits from Node,
// like an ImageView to display a specific image
private ObjectProperty<Shape> shape;
private StringProperty text;
public Model(Shape shape, String text) {
this.shape = new SimpleObjectProperty<>(shape);
this.text = new SimpleStringProperty(text);
}
public Shape getShape() {
return shape.get();
}
public ObjectProperty<Shape> shapeProperty() {
return shape;
}
public String getText() {
return text.get();
}
public StringProperty textProperty() {
return text;
}
}
private class ShapeTableCell extends TableCell<Model, Shape> {
@Override
protected void updateItem(Shape item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setGraphic(null);
} else {
setGraphic(item);
}
}
}
}
Подсказка: старайтесь не использовать PropertyValueFactory
и вместо этого используйте Callback
. PVF использует отражение, которое никогда не является лучшим решением, когда у вас есть альтернативное.