我正在使用附加到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吗?
提前谢谢。
我发现有两个问题:
-
我的模型中的双精度或整数值需要与字符串相互转换。我可以直接在列中配置它:
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); } } ) );
-
另一方面,我必须获取编辑单元格的事件,并为可观察列表的项目提供新值。然后我必须更新项目并刷新表视图:
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(); } } );