Hej, potrzebuje porady. Piszę aplikację do zarządzania plikami pdf. Z pewnych względów wykorzystuję bazę danych do przechowywania informacji o plikach (zamiast np. xml-a). W interfejsie używam JTree i JTable, drzewo potrzebne jest o to, żeby pokazać czytelnie strukturę plików i katalogów. Chciałbym teraz, żeby po kliknięciu na węzeł drzewa (odpowiedni folder) pokazawała się zawartość folderu w tabeli wraz z informacjami o plikach, nie bardzo wiem jak zrobić odpowiednie modele dla drzewa i tabeli, chodzi o to, żeby korzystać z informacji zapisanych w bazie, a nie odczytywać dane z dysku. Główne, najważniejsze pytanie, czy koniecznie trzeba bawić się w implementację drzewa w bazie danych? Jeżeli tak, to które z rozwiązań będzie najlepsze? Może ktoś z Was robił juz coś podobnego...
http://download.oracle.com/javase/tutorial/uiswing/components/tree.html
Tu jest sporo o drzewach w Swingu.
Czy trzeba robić drzewo w tabeli? Raczej tak. Możesz się ograniczyć do dodania parent id (+ indeks na nim, aby to było szybkie) do każdego pliku i folderu, to wystarczy, aby uzyskać strukturę drzewiastą. Dodatkowo możesz ładować wyświetlane węzły leniwie (ang. lazily), aby zyskać na wydajności.
Dzięki za odpowiedź zrezygnowałem z wcześniejszego sposobu, buduję drzewo w operciu o strukturę katalogową dysku, wykorzystuję ten kod: http://www.java2s.com/Tutorial/Java/0240__Swing/JTreeDisplayingtheFileSystemHierarchyUsingtheCustomTreeModel.htm , chciałbym jednak zmodyfikować go tak, żeby w drzewie wyświetlane były tylko foldery, próbowałem dodawać Filefilter w odpowiednich metodach, ale nie działa, jak można to naprawić?
FileFilter czy FilenameFilter odsiewający nie-katalogi powinien zadziałać. Dodaj go wszędzie gdzie jest używana metoda File.list(). Pasuje też zmienić metodę isLeaf() na mniej więcej taką: node.list(filter).length == 0.
niestety nie działają te filtry, chyba, że ja nie potrafię ich napisać, cały czas dostaję katalogi i pliki, załączam kod jednej z metod, ktoś widzi tutaj błąd?
public Object getChild(Object parent, int index) {
File directory = (File) parent;
FilenameFilter filter = new FilenameFilter() {
public boolean accept(File dir, String name) {
return dir.isDirectory();
}
};
String[] directoryMembers = directory.list(filter);
return (new File(directory, directoryMembers[index]));
}
Błąd jak byk. Zamiast dir.isDirectory() powinno być new File(dir, name).isDirectory(). dir jest zawsze katalogiem.
hmm, rzeczywiście, dzięki, za błyskawiczną odpowiedź, nie bardzo rozumiem, czemu przekazywany argument jest zawsze katalogiem, ale dojdę do tego, jeszcze raz dzięki!
Wystarczy zajrzeć do javadoców:
http://download.oracle.com/javase/1.4.2/docs/api/java/io/FilenameFilter.html napisał(a)
Parameters:
dir - the directory in which the file was found.
name - the name of the file.