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



我正在使用附加到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. 另一方面,我必须获取编辑单元格的事件,并为可观察列表的项目提供新值。然后我必须更新项目并刷新表视图:

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

最新更新