2017-04-03 53 views
0

我有一些TableView有兩列 - 名稱和大小; 該表適用於File對象;JavaFX TableView如何獲取文件大小爲PropertyValueFactory?

用於列的PropertyValueFactory可以獲取對象的屬性,嘗試搜索somenameProrperty,getSomename,isSomename; 我需要從File獲取length()方法。

columnName.setCellValueFactory(new PropertyValueFactory<>("name")); 
columnSize.setCellValueFactory(new PropertyValueFactory<>("length")); 

此代碼視圖文件名(getName()方法),但長度列是空的。 知道任何人我可以用工廠做的長度()從文件?

回答

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