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);
}
}
}
}
我正在尝试根据 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);
}
}
}
}