Zum Inhalt springen

JTree zur Laufzeit ändern


madbat

Empfohlene Beiträge

Guten Morgen,

Ich hab da mal wieder ein Problem ^__^

also, folgendes, ich habe einen https Server, von dem ich mir eine FileList hohle, alles ziemlich umständlich da ich dafür die index.html auslesen muss,

die ganze Verzeichniss strucktur stelle ich in einem DefaultMutableTreeNode dar : root. Jetzt ist der Server aber ziemlich groß, sodass ich nur bis zu einer Tiefe von einem Verzeichniss einlese, damit der Baum nicht erst nach 10 Minuten angezeigt wird, da der Einlesevorgang doch etwas dauert.

Ich setzte also einen Eventlistender TreeExpansionEvent, der mir bei Expansion einer Node root aktualisieren soll, das macht der auch(lasse mir root in die console ausgeben, da stimmt alles) das Problem ist jetzt nur, dass er mir das im JTree nicht anzeigt, hier mal mein Code zum aktualisieren:

(sogar alles brav kommentiert ausnahmsweise mal xD^^)


 private void showNode(javax.swing.event.TreeExpansionEvent evt) {                          

        DefaultMutableTreeNode selected = (DefaultMutableTreeNode) evt.getPath().getLastPathComponent();

        try {

            //Lege neues Verzeichniss von der geöffneten Node an

            Verzeichniss Vz = new Verzeichniss(evtPathToURL(selected));

            //Sollte das Verzeichniss Unterverzeichnisse haben...

            if (Vz.subCategories().length > 0) {

                //füge die Unterverzeichnisse an selected an

                getDirTree(selected, Vz, 1);

                //setzte root Verzeichniss auf neues rootVerzeichniss

                //root = (DefaultMutableTreeNode) selected.getRoot();

                //root in die Konsole

                printTree(root);

                //übergib den JTree den neuen DefaultMutableTreeNode

                //und versuche diesen zu zeichnen

                dirTree = new JTree(root);

                dirTree.validate();

                dirTree.repaint();

                this.repaint();

            }

        } catch (MalformedURLException ex) {

            Logger.getLogger(openOnlineDialog.class.getName()).log(Level.SEVERE, null, ex);

        }


    }                         


    private void printTree(DefaultMutableTreeNode start) {

        for (int i = 0; i < start.getChildCount(); i++) {

            printTree((DefaultMutableTreeNode) start.getChildAt(i));

        }

        String tmp = "";

        for (int i = 0; i < start.getPath().length; i++) {

            tmp = tmp + start.getPath()[i];

        }

        System.out.println(tmp);

    }


    public static void getDirTree(DefaultMutableTreeNode parent, Verzeichniss actKat, int tiefe) throws MalformedURLException {

        //forEach Unterverzeichniss von aktueller Kategorie

        for (int i = 0; i < actKat.subCategories().length; i++) {

            //Erstelle neues subKategorie

            Verzeichniss subKat = new Verzeichniss(actKat.subCategories()[i]);

            String name = subKat.getName();

            //Erstelle neuen Node mit Namen der Subkategorie

            DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(name);

            //...und füge sie der parentNode hinzu

            parent.add(newNode);

            //Wenn das Verzeichniss weitere unterVerzeichnisse hat wiederhohle die den Prozess

            //bis Tiefe 0 ist, und füge             

            if (subKat.subCategories().length > 0) {               

                if (tiefe > 0) {

                    getDirTree(newNode, subKat, tiefe - 1);

                }

            } 

        }

    }

Schon mal vielen Dank für eure Hilfe,

madBat

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

Tja manchmal hilft wohl einfach etwas Abstand nehmen und was anderes machen und dann wieder einsteigen...

dann einmal neu bauen und tadaa, es klappt,

hier meine Lösung für interessierte:


private void showNode(javax.swing.event.TreeExpansionEvent evt) {
try {
DefaultMutableTreeNode selected = (DefaultMutableTreeNode) evt.getPath().getLastPathComponent();
Verzeichniss subKat = new Verzeichniss(evtPathToURL(selected));

//Füge an angeklickte Node den dazugehörigen
// Verzeichnisbaum bis Tiefe 1 an
getDirTree02(selected, subKat, 1);

//Öffne Verzeichniss und scrolle zu erstem Unterverzeichniss
DefaultMutableTreeNode newNode = (DefaultMutableTreeNode) selected.getChildAt(0);
dirTree.scrollPathToVisible(new TreePath(newNode.getPath()));
dirTree.repaint();
} catch (MalformedURLException ex) {
Logger.getLogger(openOnlineDialog02.class.getName()).log(Level.SEVERE, null, ex);
}
}

public static void getDirTree02(DefaultMutableTreeNode parent, Verzeichniss actKat, int tiefe) throws MalformedURLException {
//Abfrage ob Node schon ein Verzeichnisbaum zugeordnet wurde
boolean isAlreadyLoaded = false;
if (parent.getChildCount() > 0){
if (parent.getChildAt(0).getChildCount() > 0){
isAlreadyLoaded = true;
}
}
if ((tiefe > -1)&&(!(isAlreadyLoaded))) {
for (int i = 0; i < actKat.subCategories().length; i++) {
Verzeichniss subKat = new Verzeichniss(actKat.subCategories()[i]);
//Gucke ob Node schon existiert:
if (parent.getChildCount() > i) {
if (subKat.getName().equalsIgnoreCase(parent.getChildAt(i).toString())) {
//Wenn der Name schon vorhanden, dann erstelle keine neue Node, sondern arbeite
//mit der alten weiter
getDirTree02((DefaultMutableTreeNode) parent.getChildAt(i), subKat, tiefe - 1);
continue;
}
}
//Erstelle eine neue Noe wenn Name noch nicht vorhanden
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(subKat.getName());
getDirTree02((DefaultMutableTreeNode) newNode, subKat, tiefe - 1);
parent.add(newNode);

}
}
}

private DefaultTreeModel initTree() {
try {
URL serverurl = Var.getServer();
Verzeichniss actKat = new Verzeichniss(serverurl);

//Richte rootVerzeichniss ein.
DefaultMutableTreeNode root = new DefaultMutableTreeNode(serverurl.toString());
getDirTree02(root, actKat, 1);
treeModel = new DefaultTreeModel(root);
return treeModel;

} catch (MalformedURLException ex) {
System.err.println(ex.getMessage());
}
return null;
}

[...]
JTree dirTree = new JTree((TreeModel) initTree());
dirTree.addTreeExpansionListener(new javax.swing.event.TreeExpansionListener() {
public void treeExpanded(javax.swing.event.TreeExpansionEvent evt) {
showNode(evt);
}
});
[...]
[/PHP]

Weniger Comments als beim letzten Mal ich hoffe trotzdem verständlich, ansonsten einfach melden ^__^

Der letzte Teil muss dann dort rein wie die Komponenten initalisiert werden.

Verbesserungsvorschläge werden gerne noch angenommen,

grüße madbat

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...