JavaFX TableView nie wyświetla rozmiaru pliku w tabeli

0

Witajcie! :)
Piszę sobie aktualnie mały program do tworzenia plików ZIP i w związku z tym chciałem skorzystać z TableView dostępnego w pakiecie JavaFX. Używam wersji 8 JDK. Kod elegancko wypisuje nazwę pliku i ścieżkę, lecz nie jestem w stanie wyświetlić rozmiarów poszczególnych plików. Próbowałem z TableColumn<File, String> fileSize = new TableColumn<File, String>("Size"); oraz TableColumn<File, Integer> fileSize = new TableColumn<File, Integer>("Size");, aż sprawdziłem w dokumentacji, że metoda zwraca long. Mimo zmian, nic się nie wyświetla.

		File folder = new File("C:/");
		ObservableList<File> list = FXCollections.observableArrayList(folder.listFiles());
		table = new TableView<File>(list);
		
		TableColumn<File, String> fileName = new TableColumn<File, String>("Name");
		fileName.setCellValueFactory(new PropertyValueFactory<>("name"));

		TableColumn<File, String> filePath = new TableColumn<File, String>("Path");
		filePath.setCellValueFactory(new PropertyValueFactory<>("absolutePath"));
		
		TableColumn<File, Long> fileSize = new TableColumn<File, Long>("Size");
		fileSize.setCellValueFactory(new PropertyValueFactory<>("length"));
		
		table.getColumns().addAll(fileName, filePath, fileSize);
		
		root.getChildren().add(table);
		

b71048023a.png

Generalnie w internecie ciężko znaleźć jakieś porządne przykłady obsługi TableView. W każdym razie nie ma prawie żadnego jeżeli chodzi o dostosowywanie kolumn i ich zawartości.
Z góry dzięki za pomoc.

0

Zmuszony jestem przywołać moderatorów i bardziej znane osoby na forum do pomocy
@Shalom, @kq, @Koziołek, @olesio, @karolinaa, @Jaca777, @katelx

3

Nie mam czasu tego sprawdzić ale podejrzewam, że nie działa z bardzo prozaicznego powodu:
Ta konstrukcja:

TableColumn<File, Long> fileSize = new TableColumn<File, Long>("Size");
fileSize.setCellValueFactory(new PropertyValueFactory<>("length"));

zakłada, że w klasie File znajduje się funkcja getLength() i jest to opisane w dokumentacji tu:
https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/cell/PropertyValueFactory.html

Ponieważ w klasie File metoda zwracające długość pliku nazywa się po prostu length() musisz użyć sposobu opisanego tu:
https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TableColumn.html
czyli coś w rodzaju:

 fileSize.setCellValueFactory(new Callback<CellDataFeatures<File, Long>, ObservableValue<Long>>() {
     public ObservableValue<Long> call(CellDataFeatures<File, Long> p) {
         return new ReadOnlyObjectWrapper(p.getValue().length());
     }
  });

Napisane z palca - nie gwarantuję, że działa.
Spróbuj w ten sposób i daj znać czy pomogło - jak nie to będziemy kombinować :)

0

@Burdzi0, słuchaj @dymul, bo ma rację. Całość rozbija się o specyfikację Java Beans, w której są pewne konwencje nazewnicze. Klasa File je radośnie łamie.

0

Super!
Dzięki @dymul rzeczywiście działa :) @Koziołek Tobie również, stawiam, że po prostu dymul był pierwszy.
Tak z innej beczki jak zdobyć wiedzę na temat tych klas typu PropertyValueFactory czy ReadOnlyObjectWrapper? Bo nawet jakbym chciał znaleźć odpowiedź (na przykład na to pytanie) to nie wiem o co pytać wujka googla czy ciotkę oracle.

1

@Burdzi0, mieć dobre IDE i intensywnie korzystać z podpowiadania składni. Zakładam, że jesteś początkującym. Mały trik zatem. Jak nachodzi cię niechcica zwana prokrastynacją albo jak głowisz się nad problemem, to zacznij bawić się z podpowiadaniem składni i wybieraj sobie metody, których nie znasz. Poczytaj dokumentację i dość szybko odkryjesz kilka pojęć, które już nadają się jako zapytania do Google.

1

Jeżeli chodzi o JavaFX to ze swojej strony polecałbym jakąś książkę np. "Learn JavaFx 8" wydaną przez apress - jest tam fajny rozdział na temat propertisów i bindingsów - przydaje się, jak się człowiek nie chce kopać z koniem.
Wbrew pozorom jest duża różnica pomiędzy pisaniem aplikacji okienkowej w Swing a w JavaFX. Większość rzeczy oczywiście da się zrobić tak samo ale są pewne wyjątki. Dodatkowo FX potrafi całkiem dużo zrobić za programistę - na przykład to czego nieświadomie użyłeś - ale jak nie wiesz, że wymaga to np określonej konwencji nazewniczej to potrafi też nieźle dokopać.
Programując w FX dobrze jest też poświęcić trochę czasu i przygotować sobie odpowiednie klasy wrappery, których wszystkie pola są propertisami i to ich używać w GUI, w Twoim przykładzie zrobiłbym raczej tak, że stworzył bym klasę FileWrapper i jej używał w tabeli.
Czyli miałbyś TableView<FileWrapper> a wszystkie interesujące cię pola jak propertisy zbindowane z polami klasy obudowanej. Wtedy całkowicie wyzbywasz się takich problemów z jakimi się zderzyłeś a wszystkie ChangeLstenery itp się piszą praktycznie same.

0

@dymul Rzeczywiście książka byłaby tu dobrym rozwiązaniem, jednakże: mam jeszcze część kompendium Herberta Schildta do przerobienia a w kolejce czekają już "Java. Zaawansowane zastosowania" oraz "Java EE 6 Zaawansowany przewodnik". Dodatkowo w miedzyczasie "Czysty kod". No i nie ukrywam, że nie ciągnie mnie do frontu - wolę logikę od wyglądu :P Choć ciągle nie jestem w stanie się sprecyzować jeżeli chodzi o desktop/web/smartfony albo Bóg wie co jeszcze... Irytuje mnie to niesamowicie.

W każdym razie wielkie dzięki ;) Twoja pomoc jest nieoceniona :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1