JavaFX TableView - Generic OnEditCommit

时间:2016-12-14 05:34:17

标签: java generics javafx

我想将以下代码转换为通用Java类型,以避免为每个新表列手动重新编码on edit编辑提交...

colOccurrences.setOnEditCommit(
            new EventHandler<TableColumn.CellEditEvent<Damageloop, Float>>() {
                @Override 
                public void handle(TableColumn.CellEditEvent<Damageloop, Float> t) {
                    ((Damageloop)t.getTableView().getItems().get(
                            t.getTablePosition().getRow())).setOccurrences(t.getNewValue());
                }
        });

我尝试将以下代码添加到分配给每个表列的自定义单元工厂类...

TableColumn<S, T> col = super.getTableColumn();
col.setOnEditCommit(
new EventHandler<CellEditEvent<S, T>>() {
    @Override
    public void handle(CellEditEvent<S, T> t) {
        TableColumn<S, T> col = t.getTableColumn();
        int row = t.getTablePosition().getRow();
        ObservableValue<T> ov = col.getCellObservableValue(row);
        if (ov instanceof WritableValue) {
            ((WritableValue<T>)ov).setValue(t.getNewValue());
        }
    }
});

这成功地设置了正在编辑的单元格的基础可观察值。但是,当我打电话给...

TableView.getSelectionModel().getSelectedItem()

在代码的另一部分中,仍然返回旧的未编辑的值。但是,如果我在编辑提交时更新我的​​通用以包含以下内容......

TableColumn<S, T> col = super.getTableColumn();
col.setOnEditCommit(
new EventHandler<CellEditEvent<S, T>>() {
    @Override
    public void handle(CellEditEvent<S, T> t) {
        TableColumn<S, T> col = t.getTableColumn();
        int row = t.getTablePosition().getRow();
        ObservableValue<T> ov = col.getCellObservableValue(row);
        if (ov instanceof WritableValue) {
            ((WritableValue<T>)ov).setValue(t.getNewValue());
        }
        //NEW ADDITION TO EVENT HANDLER
        Date date;
        date = (Date) t.getNewValue();
        ((Damageloop) t.getTableView().getItems().get(t.getTablePosition().getRow())).setDamageloopworkshopduedate(date);
    }
});

TableView.getSelectionModel()。getSelectedItem()代码将返回正确的更新值。

任何人都可以告诉我为什么令人难以置信的价值没有更新支持列表?或者更恰当地如何将我的事件处理程序中的新添加转换为使用泛型?

1 个答案:

答案 0 :(得分:2)

首先,您可能根本不需要这几个原因。

  1. 如果您在模型类中使用JavaFX properties pattern,即执行

    public class Damageloop {
    
        private ObjectProperty<Float> occurrences = new SimpleObjectProperty<>(0.0f);
    
        public ObjectProperty<Float> occurrencesProperty() {
            return occurrences ;
        }
    
        public final Float getOccurrences() {
            return occurrencesProperty().get();
        }
    
        public final void setOccurrences(Float occurrences) {
            occurrencesProperty().set(occurrences);
        }
    
        // ...
    }
    

    然后标准的可编辑表格单元格(例如TextFieldTableCell)将默认更新编辑提交中的属性:即根本不需要定义onEditCommit处理程序。

    < / LI>
  2. 即使您不使用上述属性模式,Java 8 lambda表达式和增强型类型推断已经允许您将整个第一个代码块减少为单行语句:

    colOccurrences.setOnEditCommit(e -> e.getRowValue().setOccurrences(e.getNewValue()));
    
  3. 如果您真的想以可重用的通用方式创建它,可以执行类似

    的操作
    public class TableUtils {
    
        public static <S,T> void createDefaultEditHandler(
            TableColumn<S,T> column, BiConsumer<S,T> committer) {
    
            column.setOnEditCommit(event -> 
                committer.accept(event.getRowValue(), event.getNewValue()));
    
        }
    }
    

    你可以调用:

    TableUtils.createDefaultEditHandler(colOccurrences, Damageloop::setOccurrences);
    

    (对于其他类型的列,这完全可以重用...)。