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 吗?
提前致谢。
我发现有两个问题:
我的模型中的双精度值或整数值需要与字符串相互转换。我可以直接在专栏里配置这个:
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);
}
}
)
);
另一方面,我必须获取编辑单元格的事件并将新值赋予 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();
}
}
);
我正在使用附加到 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); } } ) );
另一方面,我必须获取编辑单元格的事件并将新值赋予 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(); } } );