JavaFX TableCell:与实际单元格值类型不同的编辑“类型”

时间:2018-08-05 10:37:46

标签: java javafx

我有一个TreeTableView,它具有第一列,该列将显示其包含的数据的两个值(一个文本和一个对应的图标)。

因此,我将第一列定义如下:

@FXML
private TreeTableColumn<IPackagingUnit, IPackagingUnit> colSerial; 

cellFactory设置为:

colSerial.setCellFactory(CellFactorySerial.INSTANCE);

最后将cellValueFactory设置为:

colSerial.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(param.getValue().getValue()));

CellFactorySerial定义为:

public class CellFactorySerial implements Callback<TreeTableColumn<IPackagingUnit, IPackagingUnit>, TreeTableCell<IPackagingUnit, IPackagingUnit>> {
    public static CellFactorySerial INSTANCE = new CellFactorySerial();
    private CellFactorySerial() {
        // Nothing
    }

    /** {@inheritDoc} */
    @Override
    public TreeTableCell<IPackagingUnit, IPackagingUnit> call(final TreeTableColumn<IPackagingUnit, IPackagingUnit> param) {
        return new SerialCell();
    }

    private static class SerialCell extends AbstractPackagingUnitCellFactory<IPackagingUnit> {
        @Override
        public void updateItem(final IPackagingUnit item, final boolean empty) {
            super.updateItem(item, empty);
            if (item == null || empty) {
                setGraphic(null);
                setText(null);
            } else {
                setText(item.getPrimaryIdentity());
                setGraphic(new BufferedImageView(item.getPackagingLevel().getIcon()).getFXImageView());
            }
        };
    }
}

AbstractPackagingUnitCellFactory到目前为止是一个空壳。

我现在要做的是使此单元格可编辑,这样只有PrimaryIdentity是可编辑的。

但是当我如下设置onEditCommit

colSerial.setOnEditCommit(event -> {
    final TreeItem<IPackagingUnit> item = event.getRowValue();
    final IPackagingUnit emp = item.getValue();
    emp.setPrimaryIdentity(event.getNewValue());
});

这当然是行不通的,因为newValue是对象,而不是我想要的简单字符串。

我认为我有以下选择和问题:

  1. 我可以将列定义设置为IPackagingUnit, String,但是那样我会丢失获取图标所需的信息
  2. 将第一列分为两部分,一个显示图标,另一个显示主要身份。

我目前正在尝试第一种方法,但是似乎无法从param的{​​{1}}中取出包装单元,无法将包装单元本身传递到单元格以处理图标。

任何人都知道如何

  • 获取call(final TreeTableColumn<IPackagingUnit, IPackagingUnit> param)的第一个通用参数?
  • 还是类型保留为param并且仍要进行IPackagingUnit编辑?
  • 还有其他方法可以保留图标并仍然可以编辑单元格吗?

谢谢

1 个答案:

答案 0 :(得分:0)

好吧,虽然这并不是我真正想要的,但稍事休息然后回来,我发现了getTreeTableRow(属于TreeTableCell),这有助于选择一。可能是这样做的唯一方法...