madbat Geschrieben 5. Februar 2010 Teilen Geschrieben 5. Februar 2010 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
madbat Geschrieben 18. Februar 2010 Autor Teilen Geschrieben 18. Februar 2010 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.