我有一个表格,其中有一个可编辑的数量列,价格的值取决于用户输入的数量。该表的快照如下:
此处,价格仅为1个数量。我希望价格在用户更改数量时自动更改。我读了有关绑定并尝试过它们,但未能成功实现它们。我不知道正确的方法。
答案 0 :(得分:2)
您可以将总数绑定到数量*价格
public class LineItem {
private final SimpleDoubleProperty price = new SimpleDoubleProperty();
private final SimpleIntegerProperty qty = new SimpleIntegerProperty();
private final SimpleDoubleProperty total = new SimpleDoubleProperty();
public LineItem() {
DoubleBinding db = new DoubleBinding() {
{
super.bind(price, qty);
}
@Override
protected double computeValue() {
return (price.get() * qty.get());
}
};
total.bind(db);
}
//important! add getters and setters
}
以同样的方式,如果您只想听qty更改,可以在LineItem构造函数中添加一个侦听器而不是绑定。
qty.addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) {
total.set(price.get()*qty.get());
}
});
您的表格应使用ObIableList of LineItem
ObservableList<LineItem> lines = FXCollections.observableArrayList();
TableView table = new TableView(lines);
这样当底层列表发生变化时,表也会发生变化。
答案 1 :(得分:1)
一旦用户提交了更改并使用它来更新表,就可以使用TableColumn的onEditCommit()
来检索值。
首先需要设置监听器。请查看文档:{{3}}
从文档更新:
因为ObservableList对象可以跟踪任何更改 对于其元素,TableView内容随时会自动更新 数据发生了变化。
答案 2 :(得分:0)
您可以使用onEditCommit,如图所示
quantity.setOnEditCommit((evt) -> {
evt.getRowValue().setQuantity(evt.getNewValue());
int quanity = evt.getNewValue();
int costPrice = evt.getRowValue().getCostPrice();
int price = cosePrice * quantity
evt.getRowValue().setPrice(price);
tableView.getColumns().get(0).setVisible(false);
tableView.getColumns().get(0).setVisible(true);
});
每次更改数量时,都会刷新您的表格。