我正在尝试编写一个通常称为“属性编辑器”或“属性网格”的 JavaFx 组件。属性是名称-值对。
我想属性表是为此而制作的,但我想使用 TreeTableView。主要是因为我有嵌套的属性,最终有几列。
右边的组件正是我试图实现的。
我在使用 TreeTableView 时遇到的问题是,必须在 CellFactory 中进行单元格自定义,这会导致项目类型的切换。这种解决方案使事情变得非常不灵活。
例如,如果字符串值必须通过给定属性的 TextField 和另一个属性的 ComboBox 更新,会发生什么情况?
任何建议都非常受欢迎!
相关问题:javafx-8-custom-listview-cells-its-evil
更新1
我试图实施@fabian 的第一个建议。
我有我的豆子:
public class PropertyItem {
private StringProperty name = new SimpleStringProperty("");
private EditableItem value;
...
}
EditableItem 的默认实现,通过在 TextField 中编辑字符串:
public class DefaultEditableItem implements EditableItem {
String value = "init value";
private TextField textField = new TextField();
public DefaultEditableItem(String value) {
this.setValue(value);
}
// implementations of assignItem, removeItem, startEdit, cancelEdit,... as suggested for the cell behavior
}
我对 TableView 的实现:
PropertyItem rootProp = new PropertyItem("ROOT", new DefaultEditableItem("test roots"));
TreeItem<PropertyItem> root = new TreeItem(rootProp);
// the name column is straightforward ...
// value column
TreeTableColumn<PropertyItem, EditableItem> valueColumn = new TreeTableColumn<>("VALUE");
valueColumn.setCellValueFactory(new Callback<TreeTableColumn.CellDataFeatures<PropertyItem, EditableItem>, ObservableValue<EditableItem>>() {
@Override
public ObservableValue<EditableItem> call(TreeTableColumn.CellDataFeatures<PropertyItem, EditableItem> cellData) {
TreeItem<PropertyItem> treeItem = cellData.getValue();
PropertyItem propertyItem = treeItem.getValue();
// this will not compile...
return propertyItem.value();
}
});
valueColumn.setCellFactory(new Callback<TreeTableColumn<PropertyItem, EditableItem>, TreeTableCell<PropertyItem, EditableItem>>() {
@Override
public TreeTableCell<PropertyItem, EditableItem> call(TreeTableColumn<PropertyItem, EditableItem> param) {
return new EditingTreeTableCell();
}
});
valueColumn.setOnEditCommit(...)
treeTableView.getColumns().addAll(nameColumn, valueColumn);
treeTableView.setEditable(true);
我的问题出在需要返回 ObservableValue 的 cellValueFactory 上。鉴于我希望此列可编辑,我应该怎么做?
我猜 EditableItem 必须扩展属性?但是,我的 DefaultEditableItem 可以扩展 SimpleStringProperty 吗?