在我的 JavaFx 项目中,我有一个带有几个 View 的场景。对于窗口的页脚,我有一个从 TableView 扩展的类:
public class FooterView extends TableView<Area> implements ViewTemplate {...}
这将显示一个表格,其中包含 .csv 文件中的一些数据。
当涉及到将特定的presentationmodel属性的值分配给单元格时,我这样做:
TableColumn<Area,Double> powerColumn = new TableColumn<>("Power Overview");
powerColumn.setCellValueFactory(new PropertyValueFactory<>("powerPerArea"));
this.setItems(filePM.getAreas()); //filePm is my filehandler
this.getColumns().addAll(powerColumn, other_columns);
getAreas()
看起来像这样:
public List<Area> readCantonsFromFile() {
try (Stream<String> stream = getStreamOfLines(AREA_FILE_NAME)) {
return stream.skip(1)
.map(l -> new Area(l.split(DELIMITER, 12)))
.collect(Collectors.toList());
}
}
在Area
的构造函数中,我设置了属性。其中一个属性是提到的 powerPerArea
private final DoubleProperty powerPerArea = new SimpleDoubleProperty();
...
public void setPowerPerCanton(double powerPerCanton) {
this.powerPerCanton.set(powerPerCanton);
}
我的问题:有没有办法在显示值之前更改 FooterView 中的值?我尝试过这样的事情:
powerColumn.setCellValueFactory(Math.round(new PropertyValueFactory<>("powerPerArea")));
但我似乎混淆了 DoubleProperty、Double 和 ObservableDouble。我可以修改这里的值吗?
问题:我无法舍入 setter 中的值,因为我通过此函数在循环中添加了 double 值:
public void addPowerPerArea(double power){
double sum = getPowerPerCanton() + power;
setPowerPerCanton(sum);
}
四舍五入这里的值会给我一个错误的结果。 (四舍五入不够精确)。最后我需要在所有金额相加后执行此操作
最佳答案
您应该使用 cellValueFactory
来确定单元格中显示哪些数据:在这种情况下,您的 PropertyValueFactory
返回的数据是从 powerPerAreaProperty().get()
返回的实际 double
值,这正是您想要的。
如果您想控制数据的显示方式,您应该使用cellFactory
。因此,要以特定格式显示数据,包括限制小数位数,您可以这样做:
powerColumn.setCellFactory(tc -> new TableCell<Area, Double>() {
@Override
protected void updateItem(Double power, boolean empty) {
super.updateItem(power, empty);
if (empty) {
setText(null);
} else {
setText(String.format("%.0f", power.doubleValue()));
}
}
});
这里的要点是,您不应该根据您想要的显示方式来修改数据;同时拥有 cellValueFactory
和 cellFactory
的目的是将数据的显示与实际数据本身分开。
关于java - 在 TableView 中使用 PropertyValueFactory 中的值 - JavaFx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50289679/