java - 在 TableView 中使用 PropertyValueFactory 中的值 - JavaFx

标签 java javafx tableview tablecell

在我的 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()));
        }
    }
});

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

关于java - 在 TableView 中使用 PropertyValueFactory 中的值 - JavaFx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50289679/

相关文章:

java - 当网站链接被点击时,如何增加数据库中的点击次数?

java - 我想删除一个文件并将新文件重命名为旧文件

java - jTable中没有显示数据,没有数据出现在jTable中

JavaFX TreeView 展开/折叠披露箭头错误

java - 捆绑的 JavaFX 应用程序使用非英语参数运行时抛出 "Could not start JVM"

ios - 当 2 个选项卡并排共享同一个 tableView 时,UITableView 会产生额外空间

java - 如何在 Java 中创建一个简单的状态机

java - 异步建立连接

ios - TableView 聊天扩展消息

swift - 更改 tableView 中单元格的 editingStyle 背景颜色和标签