JavaFX TableView如何获取PropertyValueFactory的文件大小?

时间:2017-04-03 11:04:12

标签: file javafx tableview

我有一些TableView有两列 - 名称和大小; 此表适用于File对象;

列的PropertyValueFactory可以获取对象的属性,尝试搜索somenameProrperty,getSomename,isSomename; 我需要从File。

获取length()方法
columnName.setCellValueFactory(new PropertyValueFactory<>("name"));
columnSize.setCellValueFactory(new PropertyValueFactory<>("length"));

此代码视图文件名(getName()方法),但长度为colums为空。 知道我可以用工厂做什么来获取文件中的长度()?

2 个答案:

答案 0 :(得分:0)

找到解决方案

columnSize.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<File, String>, ObservableValue<String>>() {
    @Override
    public ObservableValue<String> call(TableColumn.CellDataFeatures<File, String> param) {
        long size = param.getValue().length();
        size = size/1024;
        return new ReadOnlyObjectWrapper(String.valueOf(size));
    }
});

答案 1 :(得分:0)

您应该直接实现单元格值工厂,而不是使用方便(有些遗留)类PropertyValueFactory

假设您的columnSizeTableColumn<File, Number>,您可以

columnSize.setCellValueFactory(cellData -> 
    new SimpleLongProperty(cellData.getValue().length()));

如果要更优雅地格式化列中的数据,可以另外设置单元格工厂:

columnSize.setCellFactory(col -> new TableCell<File, Number>() {
    @Override
    protected void updateItem(Number length, boolean empty) {
        super.updateItem(length, empty);
        if (empty) {
            setText(null);
        } else {
            setText(formatFileLength(length.longValue()));
        }
    }
});

// ...

private String formatFileLength(long length) {
    final String[] unitNames = {"bytes", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"};
    int i ;
    for (i = 0 ; length > 1024 && i < unitNames.length - 1 ; i++) {
        length = length / 1024 ;
    }
    return String.format("%,d %s", length, unitNames[i]);
}