繁体   English   中英

在TableView中使用PropertyValueFactory中的值-JavaFx

[英]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()));
        }
    }
});

这里的要点是,您不应根据想要的显示方式修改数据; 同时具有cellValueFactorycellFactory的目的是将数据的显示与实际数据本身分开。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM