gpt4 book ai didi

JavaFX TableView - 通用 OnEditCommit

转载 作者:行者123 更新时间:2023-11-30 02:42:47 26 4
gpt4 key购买 nike

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

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. 如果您使用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 处理程序.

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

    colOccurrences.setOnEditCommit(e -> e.getRowValue().setOccurrences(e.getNewValue()));

如果您确实想以可重用的通用方式创建它,您可以执行类似的操作

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);

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

关于JavaFX TableView - 通用 OnEditCommit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41135522/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com