JTree, baza danych i JTable

0

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...

0

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.

0

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ć?

0

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.

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

Błąd jak byk. Zamiast dir.isDirectory() powinno być new File(dir, name).isDirectory(). dir jest zawsze katalogiem.

0

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!

0

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.

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