JTree - nach Auswahl aus JFileChooser wird nur der erste Knoten angezeigt

hiwi

Mitglied
Hallo,
ich hab schon ein paar Dinge probiert, aber nichts davon hat geklappt.
ich habe einen JTree, genauer gesagt einen DNDTree, den ich im Internet gefunden habe, mit einem MouseEventListener ausgestattet, der mir einen JFileChooser öffnet, wenn auf die Root rechtsgeklickt wird und wo man sich eine datei auswählen kann, deren Name dann im JTree als Knoten ausgegeben werden soll. Der erste Dateienname wird auch noch angezeigt. Aber wenn ich die zweite Datei hinzufüge, wird sie nicht mehr angezeigt. Als ich noch nicht extendPath(...) gemacht habe, ging es, dass der zweite Dateiname angezeigt wird, wenn ich nach dem ersten den root nicht expandet habe. Die Iteration über die Kinder vom root, mit System.out.println gibt mir aber die richtigen Kindknoten auf der Konsole aus. Also, drin sind sie. Kann mir jemand weiterhelfen? Das wäre toll. 🙂 Die Codestelle auf die es denke ich ankommt, ist folgende, ist vielleicht das repaint am Ende nicht korrekt?
Java:
 graphsTree.addMouseListener(new PopupMouseListener() {
            @Override
            public void mousePressed(MouseEvent me) {
                int selRow = graphsTree.getRowForLocation(me.getX(), me.getY());
                if (me.isPopupTrigger() && selRow == 0) {  // rechtsklick auf root?
                    JFileChooser fileChooser = new JFileChooser();
                    fileChooser.showOpenDialog(me.getComponent());
                    File choosenFile = fileChooser.getSelectedFile();
                    DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(choosenFile.getName());
                    graphsTree.getRootNode().add(newNode);

                    Enumeration graphIterator = graphsTree.getRootNode().children();
                    while(graphIterator.hasMoreElements()){ 
                        DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode)graphIterator.nextElement();
                        System.out.println("ChildNode of Root: " + currentNode.toString());
                    }
                    graphsTree.expandPath(new TreePath(graphsTree.getRootNode().getPath()));
                    graphsTree.getParent().repaint();                    
                }
            }
 
Zuletzt bearbeitet:
Das Modell muss seinen Listeners (auch dem Baum) Bescheid sagen, wann immer sich etwas ändert. Wenn Du Baumknoten-Objekte änderst (Zeile 10: [c]graphsTree.getRootNode().add(newNode);[/c]), dann kann das Modell nicht selbst Bescheid geben, weil es davon ja gar nichts weiß. Also musst Du Dich darum kümmern, indem Du nachträglich allen Listeners am Modell Bescheid gibst: [java=11]((DefaultTreeModel) graphsTree.getModel())
.nodesWereInserted(graphsTree.getRootNode(), new int[] {
graphsTree.getRootNode().getChildCount() - 1
});[/code]
Ebenius
 
Dankeschön! 🙂 Jetzt funktionierts. Ich hatte das nodesWereInserted schon drin vorher, aber die Parameter anscheinend falsch gewählt und dann wieder rausgenommen. Ich frage mich allerdings trotzdem, wieso es beim ersten Knoten noch funktioniert hat. Aber Vielen Dank für die Hilfe!! 🙂
 

Neue Themen


Zurück
Oben