Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

JTree zur Laufzeit ändern

Empfohlene Antworten

Veröffentlicht

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

  • 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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.