[英]Work with Value from PropertyValueFactory in TableView - JavaFx
在我的JavaFx项目中,我有一个带有一些视图的场景。 对于窗口的页脚,我有一个从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
powerPerAreaProperty().get()
值,而这正是您想要的。
如果你想控制数据的显示方式 ,你应该使用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
的目的是将数据的显示与实际数据本身分开。
从cellFactory
返回自定义单元格的一种替代方法是使用自定义cellValueFactory
返回格式化为字符串的属性:
TableColumn<Area, String> powerColumn = new TableColumn<>("Power Overview");
powerColumn.setCellValueFactory(cd -> cd.getValue().powerPerAreaProperty().asString(""%.0f""));
我看到两种方法可以做到这一点。 你可以:
使用setCellFactory
方法,并在updateItem方法中设置其格式。 应该看起来像这样,还没有测试
powerColumn.setCellFactory(column -> {
return new TableCell<Area, Double>() {
@Override
protected void updateItem(Double item, boolean empty) {
super.updateItem(Math.round(item), empty);
}
};
});
或:您可以使Area
类的另一个属性绑定到现有的powerOfArea
属性,但返回四舍五入的值。 我确信这是有可能的,您可以重写readOnlyDoubleProperty
某些功能,但是应该有更好的方法。 也许通过DoubleBindings
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.