我已阅读this,但我无法清楚地看到答案。
我尝试做的是在将值插入另一个单元格时,从TableColumn获取单元格内的值...
一小段代码。
colExistenciaF.setCellFactory(TextFieldTableCell.forTableColumn(new DoubleStringConverter()));
colExistenciaF.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<Productos, Double>>() {
@Override
public void handle(CellEditEvent<Productos, Double> event) {
event.getTableView().getItems().get(event.getTablePosition().getRow())
.setExistencia(event.getNewValue());
// Code to place the calculated value in that other column
}
});
观察,我的&#34; Existencia Actual&#34;列以这种方式声明:
@FXML
private TableColumn<Productos, Double> colExistenciaI;
&#34; Existencia Actual&#34;和&#34; Diferencia&#34;列这一个:
@FXML
private TableColumn<Productos, Double> colExistenciaF;
@FXML
private TableColumn<Movproductos, Double> colDiferencia;
这是因为我拥有存储初始库存(Producto.class)或产品存在的实体,但是当我需要进行交易或移动时,我使用另一个实体(MovProducto.class)。我不知道这是否相关,但不得不提及以防你需要更多的背景。
为了给你更多的上下文,我正在使用hibernate,所以我的pojos类不能使用(如我所知)StringProperty或数据库中不存在的任何类型的数据类型。
这些是我在这个问题上使用的pojos:
这些是我的控制器(更糟糕的是DAO类的坏名称)
提前感谢James_D博士。 :)
答案 0 :(得分:0)
我创建了一个可以检查的简单示例。
public class Controller implements Initializable {
@FXML
private TableView<Model> table;
@FXML
private TableColumn<Model, Double> initial;
@FXML
private TableColumn<Model, Double> actual;
@FXML
private TableColumn<Model, Double> diff;
@Override
public void initialize(URL location, ResourceBundle resources) {
initial.setCellValueFactory(data -> data.getValue().initialProperty().asObject());
actual.setCellValueFactory(data -> data.getValue().actualProperty().asObject());
diff.setCellValueFactory(data -> data.getValue().differenceProperty().asObject());
initial.setCellFactory(factory -> new TextFieldTableCell<>(new DoubleConverter()));
actual.setCellFactory(factory -> new TextFieldTableCell<>(new DoubleConverter()));
table.setEditable(true);
diff.setEditable(false); // I think it makes sense to set non-editable
ObservableList<Model> data = FXCollections.observableArrayList();
data.add(new Model(10D, 9D));
data.add(new Model(98D, 45D));
table.setItems(data);
}
class Model {
private DoubleProperty initial;
private DoubleProperty actual;
private DoubleProperty difference;
public Model(Double initial, Double actual) {
this.initial = new SimpleDoubleProperty(initial);
this.actual = new SimpleDoubleProperty(actual);
this.difference = new SimpleDoubleProperty(initial - actual);
// Here is where the "magic" happens :)
this.difference.bind(this.initial.subtract(this.actual));
}
public double getInitial() {
return initial.get();
}
public DoubleProperty initialProperty() {
return initial;
}
public double getActual() {
return actual.get();
}
public DoubleProperty actualProperty() {
return actual;
}
public double getDifference() {
return difference.get();
}
public DoubleProperty differenceProperty() {
return difference;
}
}
class DoubleConverter extends StringConverter<Double> {
@Override
public String toString(Double object) {
return object.toString();
}
@Override
public Double fromString(String string) {
return Double.valueOf(string);
}
}
}
当然,您可以处理NumberformatException
之类的一些事情。但是你想要解决我觉得它有效。
答案 1 :(得分:0)
完成第1步后,您可以在需要计算的列中使用此代码(根据需要调整代码)。我从这个question得到了这个想法。
colDiferencia.setCellValueFactory((cellData) -> {
cellData.getValue().DiferenciaExistenciaProperty()
.bind(cellData.getValue().ProductosExistenciaActual().subtract(
Double.valueOf(String.valueOf(cellData.getValue().ProductosExistenciaInicialProperty()))));
return cellData.getValue().DiferenciaExistenciaProperty().asObject();
});
colExistenciaF.setCellFactory((d) -> {
TableCell<Productos, Double> cell = new TableCell<Productos, Double>() {
@Override
protected void updateItem(Double item, boolean empty) {
super.updateItem(item, empty);
setText(String.valueOf(item));
}
};
return cell;
});
使用这种方法你可以解决问题,但我很确定就像我一样,你会得到一些其他的错误或问题。
到目前为止,我可以在感谢所有人参与之前关闭这个问题。
非常感谢&lt; 3 。 @James_D和@Sunflame我希望你能看到我的练习项目并帮助我提高他们的帮助!再次感谢。