JavaFX - 在 TableCell 中放置一个控件(如按钮)?

JavaFX - Put a control (like a button) in a TableCell?

我正在尝试根据 table 单元格中的对象将自定义内容构建到 JavaFX table 中。我的感觉是我可以使用 setCellFactory 来做到这一点,但我不知所措....

例如...如果我有一个数据接口:

public interface dbBase { ... }

然后,我的每个数据类型都实现了该接口

public class dbType1 implements dbBase { ... }
public class dbType2 implements dbBase { ... }
public class dbType3 implements dbBase { ... }

然后,在设置我的 table 时,我有...

dataColumn.setCellFactory(data -> {
   // what should I put here?
});

dataColumn 是:

TableColumn<dbBase, object> dataColumn;

所以,我的问题是: 我如何 return 基于列中对象类型的自定义 TableViewCell?

在 setCellFactory 调用时我无法确定 class 的类型,所以我决定改用 subclass TreeTableCell。这样我就可以在项目更新时随时更改 GUI。

所以,我的 setCellValueFactor 和 setCellFactory 调用现在看起来像这样:

        dataColumn.setCellValueFactory(p -> 
             new SimpleObjectProperty<object>(p.getValue().getValue()));

        dataColumn.setCellFactory(p -> new CustomTreeTableCell());

CustomTreeTableCell() 看起来像这样:

    public class CANESTreeTableCell extends TreeTableCell<dbBase, object> {

    private final Button button;
    private final TextField textField;
    private final CheckBox checkBox;

    private ObservableValue<object> observable;

    public CustomTreeTableCell() {
        this.button = new Button();
        this.textField = new TextField();
        this.checkBox = new CheckBox();
    }

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

        if(empty) {
            setGraphic(null);
        } else {

            final TreeTableColumn<dbBase, object> column = getTableColumn();
            observable = column==null ? null : 
                column.getCellObservableValue(getIndex());

            if(item instanceof dbType1) {
                if(observable != null) {
                    button.textProperty().bind(
                        observable.getValue().getNameProperty());
                } else if (item!=null) {
                    button.setText(item.getName());
                }
                setGraphic(button);
            } else if (item instanceof dbType2) {
                if(checkBox != null) {
                    checkBox.textProperty().bind(
                        observable.getValue().getNameProperty());
                } else if (item!=null) {
                    checkBox.setText(item.getName());
                }
                setGraphic(checkBox);
            } else if (item instanceof dbType3) {
                if(observable != null) {
                    textField.textProperty().bind(
                        observable.getValue().getNameProperty());
                } else if (item!=null) {
                    textField.setText(item.getName());
                }
                setGraphic(textField);
            } else {
                setGraphic(null);
            } 

        }
    }
}