JTree +/- verschwidet wenn Knoten keine Kinder hat...

  • Themenstarter Themenstarter Gelöschtes Mitglied 56712
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 56712

Gast
Guten Tag geschätztes Forum
ich habe mir mit hilfe dieses Forums (Link: https://www.java-forum.org/thema/jtree-teil-2-wie-bringt-man-daten-in-den-jtree.23425/) "Bäume mit unendlich vielen Knoten"
versucht sowas wie einen Dateimanager (Linux) / Windows-Explorer (Windows) zu basteln.
Funktioniert auch, solange es Unterordner hat.

Mit »childName.isDirectory()« lasse ich nur die Ordner anzeigen.
Wenn es jetzt in einem Ordner KEINE Unterordner mehr gibt, verschwinden die +/- Zeichen und ich kann nur noch per doppelklick einen Node öffnen. Wenn ich dies dann mache, und es hat wieder Unterordner, erscheinen die +/- Zeichen wieder.

Meine Englischkenntnisse{ return null; }
Irgendwie weiss ich nicht wie ich die Frage im Google stellen soll, dass obiges Problem gefunden wird. Vielleicht kann hier jemand mir sagen, warum ich obiges Problem habe.

Ich übergebe dem "InfiniteModel" aus dem Link oben immer die Anzahl Ordner die im aktuellen TreePath vorhanden sind. Wie gesagt das Funktioniert. Nur wenn es KEINE Unterordner mehr hat, tritt das Problem auf.

Für Hilfe und Erklärungen woran das liegen könnte bin ich sehr Dankbar.
Richi

Ps.
Ich bin kein Java-Profi.
Ich habe mal mein "DM-Demo.jar" hochgeladen, für die die sehen wollen was nicht läuft.
 

Anhänge

Zuletzt bearbeitet von einem Moderator:
Sorry, ich hoffe ich mache das jetzt Richtig...
mit folgendem Code reagiere ich auf das Node-Erweitern.

Code:
        tree.addTreeWillExpandListener(new TreeWillExpandListener() {
      
            public void treeWillCollapse(TreeExpansionEvent e) {
                TreePath aktNode = e.getPath();
//System.out.println("\nWillCollapse ("+durchgang+"):\n\taktPath\t= "+aktPath+"\n\taktNode\t= "+aktNode+"\n----------------------------------------------------");

                int ende = 0;
                for(int i=0; i< aktPath.getPathCount(); i++) {
                    String aP = aktPath.getPathComponent(i).toString();
                    String aN = aktNode.getPathComponent(ende).toString();
                    if(i < aktNode.getPathCount()) { aN = aktNode.getPathComponent(i).toString(); }
                  
                    if(aP.equals(aN)) {
                        ende = i;
                    } else { break; }
                }
              
                if(aktNode != aktPath) {
                    TreePath closeToPath = aktPath;
                    int Start = aktPath.getPathCount()-1;
                    for(int i = Start; i > ende; i--) {
                        closeToPath = closeToPath.getParentPath();
                    }
                    if(closeToPath != aktPath) { subPfadeClose(closeToPath); }
//                    tree.collapsePath(aktPath);
                }
              
            }
          
            public void treeWillExpand(TreeExpansionEvent e) {
                TreePath aktNode = e.getPath();
                tree.setSelectionPath(aktNode);
                durchgang++;
                if(aktPath != null) {
//System.out.println("\nWillExpand ("+durchgang+"):\n----------------------------------------------------");    //\n\tvon aktPath \t= "+aktPath+"\t("+aktPath.getPathCount()+")\n\tauf aktNode \t= "+aktNode+"\t("+aktNode.getPathCount()+")
                    int ende = 0;
                    for(int i=0; i< aktPath.getPathCount(); i++) {
                        String aP = aktPath.getPathComponent(i).toString();
                        String aN = aktNode.getPathComponent(ende).toString();
                        if(i < aktNode.getPathCount()) { aN = aktNode.getPathComponent(i).toString(); }
                      
                        if(aP.equals(aN)) {
                            ende = i;
                        } else { break; }
                    }
                  
                    if(aktNode != aktPath) {
                        TreePath closeToPath = aktPath;
                        int Start = aktPath.getPathCount()-1;
                        for(int i = Start; i > ende; i--) {
                            closeToPath = closeToPath.getParentPath();
                          
                        }
                        if(closeToPath != aktPath) { subPfadeClose(closeToPath); }
//                        tree.collapsePath(aktPath);
                    }
                }

                String path = baseDir;
                if(os.toLowerCase().startsWith("lin")) { path += "/"; }
                for (int i=1; i<aktNode.getPathCount(); i++) {
                    path += aktNode.getPathComponent(i)+System.getProperty("file.separator");
                }
                File f = new File(path);
                drives = f.listFiles();
                anzahlFiles = 0;
                anzahlFiles = anzahlFile(drives, durchgang);
              
              
//                if(anzahlFiles == 0) {
//                    aktNode = aktPath;
//                }
                aktPath = aktNode;
            }
        });

Mit folgendem Code gibt er 0 zurück, wenn es keine Unterordner hat.
Code:
    // Jeder Knoten in diesem Baum hat exakt nP Kinder
    public int getChildCount( Object node ) {
        return Demo3.anzahlFiles;
    }
bei »return 0;« wird abgebrochen und beim neuzeichnen des tree sind dann keine +/- Zeichen vorhanden.

Die Knoten werden wie folgt aufgebaut: (Hier springt er nicht hinein, wenn Demo3.anzahlFiles == 0)
Code:
        // Sorgt dafür, dass dieser Knoten wirklich Kinder hat
        private void ensureChildren(){
            if( children == null ){
System.out.println("\n================ OS = "+os+" ===============");
                children = new Node[ Demo3.anzahlFiles ];
                int n=0;
                File childName = null;
                for(int i = 0; i < Demo3.drives.length; i++ ) {
                    childName = Demo3.drives[i];
                    if(childName.isDirectory() && ! childName.getName().startsWith(".")) {
                        String nodeName = null;
                        if(os.toLowerCase().startsWith("lin") && ! childName.isHidden()) {
                            nodeName = childName.getName();
                        } else if(Demo3.aktPath != null && ! childName.isHidden()) {
                            nodeName = childName.getName();
                        } else if(Demo3.aktPath == null) {
                            nodeName = childName.getPath();
                        }
                      
                        if(nodeName != null) {
                            children[n] = new Node( nodeName );
                            n++;
                        }
                    }
                }
            }
        }
Sollten noch Informationen Fehlen, bitte sagen. Die Class hat 344 Zeilen...

Vielen Dank Richi
 
Vielleicht sollte ich noch erwähnen, dass ich den JFileChooser verwenden wollte, dieser aber im Windows NICHT funktioniert. Und zu den IOException die der JFileChooser im Windows wirft, habe ich keine Hilfe gefunden. Darum wollte ich das mit dem JTree lösen.
Richi
 
Guten Tag
kann mir jemand sagen, wie ich diesen Thread schliessen kann?
Habe nirgends einen Button dazu gefunden.
Vielen Dank
Richi
 
@truesoul
So lalal... 🙄
Mit folgendem Code im (treeWillExpand) überprüfe ich jetzt zuerst die Anzahl der möglichen ( ! isHidden) Ordner und wenn 0 lasse ich den Parent-Path schliessen (welcher in aktPath steht) und setze isLast = ture:
Code:
                File f = new File(path);
                drives = f.listFiles();
                anzahlFiles = 0;
                anzahlFiles = anzahlFile(drives, durchgang);
               
                if(anzahlFiles == 0) {
                    isLast=true;
                    lastPath = aktNode;
                    tree.collapsePath(aktPath);
                    return;
                }
Das hat zur Folge, dass nicht in die Klasse "InfiniteModel" gesprungen wird.
Damit aber trotzdem der aktuelle Knoten (aktNode) markiert wird, verwende ich folgenden Code im MouseListener:
Code:
        tree.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseReleased(MouseEvent arg0) {
                if(isLast) {
                    tree.setSelectionPath(lastPath);
                }
                isLast = false;
            }
        });
leider etwas Unschön, weil er hier alles neu zeichnet und man das eben sieht.

Und im "treeExpanded" selektiere ich den Knoten, wenn "isLast == false" ist, mit:
Code:
            public void treeExpanded(TreeExpansionEvent event) {
                if(!isLast) {
                    tree.setSelectionPath(event.getPath());
                }
            }
 

Zurück
Oben