JavaFx TableView (TV) with ObservableList (OL):如何编辑TV并自动更新OL

JavaFx TableView (TV) with ObservableList (OL): How to edit the TV and update the OL automatically

我正在使用附加到 TableView 的 ObservableList。现在首先我想让 TableView 可编辑,然后当特定字段被编辑时,我想更新 ObservableList 中的相应对象。但不知何故,我很难从 TableView 获取更新的值。如果我使用

tv_column.setCellFactory(TextFieldTableCell.forTableColumn());

然后我得到错误:

Exception in thread "JavaFX Application Thread" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

我的电池价值工厂:

tv_column.setCellValueFactory(new PropertyValueFactory<SaleItem,Double>("quantity"));

型号:

public interface SaleItem {
    void setProductName(String productName);
    void setPrice(double price);
    double getPrice();
    double getTotalPrice();
    void setTotalPrice();
    String getProductCode();
    String getProductCodeDescription();
    String getDescription();
    String getProductName();
}

public abstract class NonFuel implements SaleItem {
    public SimpleIntegerProperty quantity = new SimpleIntegerProperty();
    public SimpleDoubleProperty price = new SimpleDoubleProperty(0.0);
    public SimpleStringProperty productName = new SimpleStringProperty("");
    SimpleDoubleProperty totalPrice = new SimpleDoubleProperty(0.0);
    // getter and setter
}

public class Drinks extends NonFuel {
    public Drinks() {
        setProductName("Coffee");
        setPrice(2.20);
        setQuantity(1);
    }
    // getter and setter
}

有人可以帮忙从电视中获取新的价值或更新它背后的 OL 吗?

提前致谢。

我发现有两个问题:

  1. 我的模型中的双精度值或整数值需要与字符串相互转换。我可以直接在专栏里配置这个:

    tv_column.setCellFactory(
        TextFieldTableCell.forTableColumn(
            new StringConverter<Double>() {
                @Override
                public String toString(Double object) {
                    return Double.toString(object);
                }
    
                @Override
                public Double fromString(String string) {
                    return Double.valueOf(string);
                }
            }
        )
    );
    
  2. 另一方面,我必须获取编辑单元格的事件并将新值赋予 ObservableList 的项目。然后我不得不更新项目并刷新 TableView:

    tv_column.setOnEditCommit(
        new EventHandler<TableColumn.CellEditEvent<SaleItem, Double>>() {
            @Override
            public void handle(TableColumn.CellEditEvent<SaleItem, Double> event) {
                SaleItem saleItem =  event.getTableView().getItems().get(event.getTablePosition().getRow());
                saleItem.setQuantity(event.getNewValue());
                saleItem.updatePrice();
                tv.refresh();
            }
        }
    );