2017-04-03 4 views
0

Ich habe einige TableView mit zwei Spalten - Name und Größe; Diese Tabelle arbeitet mit Dateiobjekten;JavaFX TableView, wie Dateigröße zu PropertyValueFactory erhalten?

PropertyValueFactory für Spalten können Eigenschaften des Objekts, versuchen Suche somenameProrperty, getSomename, isSomename; Ich brauche länge() -Methode von Datei.

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

Diese Codeansicht Dateinamen (getName() -Methode), aber Länge Spalten ist leer. Kennen Sie jemanden, was ich mit Factory tun kann, um Länge() aus Datei zu erhalten?

Antwort

0

Gefunden Lösung

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

Sie sollten den Zellenwert der Fabrik direkt PropertyValueFactory, anstatt die Bequemlichkeit (und etwas ältere) Klasse implementieren.

Angenommen, Ihre columnSize ein TableColumn<File, Number> ist, können Sie

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

Wenn Sie die Daten in der Spalte eleganter formatieren möchten, können Sie zusätzlich eine Zellfabrik gesetzt:

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