JTree - alle Nodes entfernen

Status
Nicht offen für weitere Antworten.

Taneeda

Aktives Mitglied
Hallo zusammen,

Ich habe da ein Problem mit einem JTree. Im Laufe meiner Applikation werden in einen JTree mehrere Einträge gemacht. Dabei läuft alles standardäßig ab, d.h. DefaultMutableTreeNode, DefaultTreeModel... nur der Renderer hab ich selbst gemacht.

Mein Problem: Ich möchte die Einträge, die in diesen JTree gemacht wurden entfernen, leider funktioniert das nicht richtig. Bisher benutze ich die Methode removeAllChildren(). Wenn ich nun aber neue Nodes zum Baum hinzufüge, werden die alten aber trotzdem angezeigt, wie kann das sein?

Aus dem FAQ bin ich auch nicht schlau geworden und auch sonst hab ich bisher nichts hilfreiches finden können, oder ich habe es schlicht übersehen...
 

manuche

Bekanntes Mitglied
Ich weiss jetzt nicht was in der Doku steht aber wie wärs wenn du dir einfach einen neuen JTree erzeugst...

z.B.:
Code:
this.alterTree = new JTree(...);

So wird der alte Baum komplett in die Tonne getreten und der GarbageCollector kümmert sich um den Rest!
 

Taneeda

Aktives Mitglied
Ja, das wäre wohl ne Möglichkeit, is aber nun nicht wirklich sauber ^^

abgesehen davon, müsste ich diesen dann erneut zur GUI hinzufügen, da hab ich auch keine Lust zu, scheint mir etwas zu viel Aufwand um einen Baum zu leeren
 
Zuletzt bearbeitet:

manuche

Bekanntes Mitglied
Vielleicht nicht das non-plus-ultra aber bevor ich mich mühsam darum kümmere den Tree aufzuräumen hau ich das Ding lieber komplett weg ^^
Irgendwelche Kollisionen gehst du damit auf jeden Fall aus dem Weg :D
 

Taneeda

Aktives Mitglied
hab das eben mal probiert. Hab die alte Referenz auf null gesetzt und nen neuen JTree erstellen lassen. Wenn ich in der Gui jetz aber auf den clear Button klicke, dann passiert nichts. Ich kann den Baum weiter normal auf und zuklappen, mit allen Einträgen... erst wenn neue Einträge hinzugefügt werden sollen, dann leert sich der Baum, neue Einträge werden aber nicht hinzugefügt.

Weiß jemand, wie man das sauber lösen kann, also wie man wirklich die Nodes vom JTree löschen kann?
 
Zuletzt bearbeitet:

MarcB

Bekanntes Mitglied
Mach nach dem leeren mal ein
Code:
((DefaultTreeModel)tree.getModel()).reload()
 

Taneeda

Aktives Mitglied
hier mal mein Code...

die Klasse Tree ist nur ein Wrapper um einen JTree
Code:
package client.view.guicomponents;

import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellRenderer;

/**
 * @brief This class creates a JTree, used in Error/Failure window for 
 * errors and failures.
 * 
 * @author Ronald
 */
public class Tree
{
    /**
     * Generated serial.
     */
    private static final long serialVersionUID = 1983919987487092942L;

    /**
     * This is the tree which holds the objects as his childs.
     */
    private JTree tree = null;
    
    /**
     * A default tree model.
     */
    private DefaultTreeModel dtmodel = null;
    
    /**
     * A node in the tree. This is the root node.
     */
    private DefaultMutableTreeNode root = null;
    
    /**
     * Signals the tree that he should expand automatic.
     */
    private boolean autoExpand = true;
    
    /**
     * An empty default constructor.
     */
    public Tree()
    { }
    
    /**
     * This constructor initializes the JTree with an array.
     * 
     * @param projects The array.
     */
    public Tree(Object[] projects)
    {
        if(tree == null)
        {
            tree = new JTree(projects);
            tree.setModel(getDefaultTreeModel());
        }
    }
    
    /**
     * Creates a JTree if not exist an returns his reference to the caller.
     * 
     * @return The reference to the JTree.
     */
    public JTree getJTree()
    {
        if(tree == null)
        {
            tree = new JTree(getDefaultTreeModel());
        }
        
        return tree;
    }
    
    /**
     * Initializes the tree with an array of objects. This method is used
     * by the workplace tree, because this tree need to initializes with
     * custom data. Also the workplace tree doesn't use the 
     * DefaultTreeModel.
     * 
     * @return void
     */
    public void initTree()
    {
        tree = new JTree();
    }
    
    /**
     * Initializes the tree with an array of objects. This method is used
     * by the workplace tree, because this tree need to initializes with
     * custom data. Also the workplace tree doesn't use the 
     * DefaultTreeModel.
     * 
     * @param projects The array with the objects.
     * @return void
     */
    public void initTree(Object[] projects)
    {
        tree = new JTree(projects);
    }
    
    /**
     * Sets the cell renderer for this Tree to cr.
     * 
     * @return void
     */
    public void setRenderer(TreeCellRenderer cr)
    {
        getJTree().setCellRenderer(cr);
    }
    
    /**
     * Creates a new model to the tree if not existing and returns the
     * reference to the caller.
     * 
     * @return The reference to the tree model.
     */
    public DefaultTreeModel getDefaultTreeModel()
    {
        if(dtmodel == null)
        {
            dtmodel = new DefaultTreeModel(getRootNode());
        }
        
        return dtmodel;
    }
    
    /**
     * Adds the Object obj to the Node to.
     * 
     * @param to    The Node which will contain the obj.
     * @param obj    The Object which will be added to node to.
     * @return void
     */
    public void addNode(DefaultMutableTreeNode to, 
        DefaultMutableTreeNode obj)
    {
        getDefaultTreeModel().insertNodeInto(
            obj, 
            to,
            getRootNode().getChildCount());
    }
    
    /**
     * Creates the root node of the JTree and returns the reference.
     * 
     * @return The reference to the root node of the JTree.
     */
    public DefaultMutableTreeNode getRootNode()
    {
        if(root == null)
        {
            root = new DefaultMutableTreeNode();
        }
        
        return root;
    }
    
    /**
     * Returns the auto expand setting to the caller.
     * 
     * @return The auto expand setting.
     */
    public boolean getAutoExpand()
    {
        return autoExpand;
    }
    
    /**
     * Delivers the Object name to the root node.
     * 
     * @param name The Object used in the root node.
     * @return void
     */
    public void setTreeName(String name)
    {
        getRootNode().setUserObject(name);
    }
    
    /**
     * Signals the client that he should expand automatically or not.
     * By default, auto expand is set to true.
     * 
     * @param aexp    The new auto expand setting.
     * @return void
     */
    public void setAutoExpand(boolean aexp)
    {
        autoExpand = aexp;
    }
}

in der Klasse GuiProgramArea, wird ein CloseableTabbedPane eingefügt, ein erster Tab mit einem Panel erstellt, dass den Tree beinhaltet

Code:
/**
     * Creates a new tabbed pane for the program area and the xml viewer
     * and returns the reference to the caller.
     * 
     * @return The reference to the tabbed pane.
     */
    public CloseableTabbedPane getJTabbedPane()
    {
        if(tabbedPane == null)
        {
            tabbedPane = new CloseableTabbedPane();
            tabbedPane.addTab
            (
                "Log", 
                new ImageIcon(getClass().getClassLoader().getResource(
                    IconLocations.ICON_APP_MAIN_TREE_PM_ROOT)), 
                getJPanelProgram()
            );
        }
        
        return tabbedPane;
    }

Code:
/**
     * This is the text pane for the program prints.
     * 
     * @return The handle to the JPanel.
     */
    private JPanel getJPanelProgram()
    {
        if(jPanelProgram == null)
        {
            jPanelProgram = new JPanel(new BorderLayout());
            jPanelProgram.setBorder(BorderFlags.loweredEtched);
            jPanelProgram.add(new PAControlPanel(), BorderLayout.NORTH);
            jPanelProgram.add(getTreeLog().getJTree());
            jPanelProgram.add(getJScrollPaneProgram());
        }
        
        return jPanelProgram;
    }

Code:
/**
     * Creates a new Tree if not existing.
     * 
     * @return The handle to the Tree.
     */
    public Tree getTreeLog() 
    {
        if(treeLog == null) 
        {
            treeLog = new Tree();
            treeLog.setTreeName("Program messages");
            treeLog.setRenderer(new TreeRendererProgram());
        }
        
        return treeLog;
    }

die bisherige Methode um den Tree zu leeren...
Code:
/**
     * This method clears the program tree by removing all entries.
     * 
     * @return void
     */
    public void clearProgramTree()
    {
        firstFileMessageReceived = false;
        firstNotifyMessageReceived = false;
        firstStandardMessageReceived = false;
        firstStatusMessageReceived = false;
        firstThmMessageReceived = false;
        
        numberFileMessages = 0;
        numberNotifyMessages = 0;
        numberStandardMessages = 0;
        numberStatusMessages = 0;
        numberThmMessages = 0;
        
        TreePath root = getTreeLog().getJTree().getPathForRow(0);
        getTreeLog().getJTree().collapsePath(root);
        
        int childsFileTree = getTreeLog().getDefaultTreeModel().
            getChildCount(getTreeFileMessages());
        for(int i=0; i<childsFileTree; i++)
        {
            getTreeLog().getDefaultTreeModel().removeNodeFromParent(
                (MutableTreeNode)getTreeFileMessages().getChildAt(i));
        }
        treeFileMessages = null;
        
        int childsNotifyTree = getTreeLog().getDefaultTreeModel().
            getChildCount(getTreeNotifyMessages());
        for(int i=0; i<childsNotifyTree; i++)
        {
            getTreeLog().getDefaultTreeModel().removeNodeFromParent(
                (MutableTreeNode)getTreeNotifyMessages().getChildAt(i));
        }
        treeNotifyMessages = null;
        
        int childsStandardTree = getTreeLog().getDefaultTreeModel().
            getChildCount(getTreeStandardMessages());
        for(int i=0; i<childsStandardTree; i++)
        {
            getTreeLog().getDefaultTreeModel().removeNodeFromParent(
                (MutableTreeNode)getTreeStandardMessages().getChildAt(i));
        }
        treeStandardMessages = null;
        
        int childsStatusTree = getTreeLog().getDefaultTreeModel().
            getChildCount(getTreeStatusMessages());
        for(int i=0; i<childsStatusTree; i++)
        {
            getTreeLog().getDefaultTreeModel().removeNodeFromParent(
                (MutableTreeNode)getTreeStatusMessages().getChildAt(i));
        }
        treeStatusMessages = null;
        
        int childsThmTree = getTreeLog().getDefaultTreeModel().
            getChildCount(getTreeThmMessages());
        for(int i=0; i<childsThmTree; i++)
        {
            getTreeLog().getDefaultTreeModel().removeNodeFromParent(
                (MutableTreeNode)getTreeThmMessages().getChildAt(i));
        }
        treeThmMessages = null;
        
        int childsRootTree = getTreeLog().getDefaultTreeModel().
            getChildCount(getTreeLog().getRootNode());
        for(int i=0; i<childsRootTree; i++)
        {
            getTreeLog().getDefaultTreeModel().removeNodeFromParent(
                (MutableTreeNode)getTreeLog().getRootNode().getChildAt(i));
        }
        
        getTreeLog().getDefaultTreeModel().reload();
        
//        getTreeLog().getRootNode().removeAllChildren();
//        getTreeFileMessages().removeAllChildren();
//        getTreeNotifyMessages().removeAllChildren();
//        getTreeStandardMessages().removeAllChildren();
//        getTreeStatusMessages().removeAllChildren();
//        getTreeThmMessages().removeAllChildren();
        
        getTreeLog().getJTree().revalidate();
        getTreeLog().getJTree().repaint();
        
        getJPanelProgram().revalidate();
        getJPanelProgram().repaint();
    }

ich weiß einfach nicht, wo der Fehler liegt
 

Taneeda

Aktives Mitglied
Ok, jetz funktionierts. lag wohl daran, dass das root node nicht richtig referenziert war... für alle interessierten, hier der korrigierte Code.

in Klasse Tree hinzufügen
Code:
/**
     * Sets the root node of the tree to.
     * 
     * @param root The new root node.
     * @return void
     */
    public void setRootNode(DefaultMutableTreeNode root)
    {
        this.root = root; 
    }
clearProgramTree()
Code:
/**
     * This method clears the program tree by removing all entries.
     * 
     * @return void
     */
    public void clearProgramTree()
    {
        firstFileMessageReceived = false;
        firstNotifyMessageReceived = false;
        firstStandardMessageReceived = false;
        firstStatusMessageReceived = false;
        firstThmMessageReceived = false;
        
        numberFileMessages = 0;
        numberNotifyMessages = 0;
        numberStandardMessages = 0;
        numberStatusMessages = 0;
        numberThmMessages = 0;
        
        TreePath root = getTreeLog().getJTree().getPathForRow(0);
        getTreeLog().getJTree().collapsePath(root);
        
        getTreeLog().getDefaultTreeModel().setRoot(null);
        getTreeLog().getDefaultTreeModel().setRoot(
            new DefaultMutableTreeNode("Program messages"));
[B] getTreeLog().setRootNode((DefaultMutableTreeNode)getTreeLog().
            getDefaultTreeModel().getRoot());[/B]
        getTreeLog().setRenderer(new TreeRendererProgram());
        getTreeLog().getJTree().updateUI();
        
        treeFileMessages = null;
        treeNotifyMessages = null;
        treeStandardMessages = null;
        treeStatusMessages = null;
        treeThmMessages = null;
        
        getTreeLog().getJTree().revalidate();
        getTreeLog().getJTree().repaint();
        
        getJPanelProgram().revalidate();
        getJPanelProgram().repaint();
    }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T JTree alle nodes expanden AWT, Swing, JavaFX & SWT 4
T Alle Kinder eines JTree bekommen AWT, Swing, JavaFX & SWT 11
P JTree: Alle Knoten geöffnet anzeigen AWT, Swing, JavaFX & SWT 2
P JTree: alle Elemente ausklappen AWT, Swing, JavaFX & SWT 3
bernd JTree: alle Laufwerke anzeigen AWT, Swing, JavaFX & SWT 3
FrittenFritze JTree, LazyLoading und "Rückwärtstraversion" AWT, Swing, JavaFX & SWT 3
J Falsches Rendern durch JCheckBox in eigenem JTree AWT, Swing, JavaFX & SWT 6
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
F Jtree aus Klasse mit Arraylisten AWT, Swing, JavaFX & SWT 1
A Swing JList zu JTree AWT, Swing, JavaFX & SWT 11
richis-fragen JTree +/- verschwidet wenn Knoten keine Kinder hat... AWT, Swing, JavaFX & SWT 6
RalleYTN Modaler Dialog und JTree Node mit sehr... seeeeehr vielen Elementen AWT, Swing, JavaFX & SWT 6
Z Swing JTree DefaultMultipleTreeNode Repräsentation ändern AWT, Swing, JavaFX & SWT 1
Z Swing Drag&Drop zwischen JTable und JTree AWT, Swing, JavaFX & SWT 4
W Swing Anzeigefehler bei JTree AWT, Swing, JavaFX & SWT 1
S Zwei JTree, ein Model, bei Selection im ersten JTree soll der zweite die Inhlate anzeigen AWT, Swing, JavaFX & SWT 2
S JRadioButton und JCheckBox im JTree AWT, Swing, JavaFX & SWT 14
H Swing JTree: Zählt der rootNode mit? AWT, Swing, JavaFX & SWT 2
krgewb Swing JTree - Farbe von nodes ändern AWT, Swing, JavaFX & SWT 4
R JTree behandeln AWT, Swing, JavaFX & SWT 2
E Swing Copy und Paste eines einzelnen Knoten aus einem JTree AWT, Swing, JavaFX & SWT 1
U dynamisches JTree erstellen AWT, Swing, JavaFX & SWT 2
J JTree updaten AWT, Swing, JavaFX & SWT 2
N Swing JTree Problem beim erstellen der Knoten AWT, Swing, JavaFX & SWT 0
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
T Swing API Frage zu Verzeichnisbäumen und JTree AWT, Swing, JavaFX & SWT 1
T JTree mit Symbolen? AWT, Swing, JavaFX & SWT 8
R Anfängerfrage: Ansichten des JTree AWT, Swing, JavaFX & SWT 1
H Swing JTree Minimumgröße AWT, Swing, JavaFX & SWT 2
F Swing JTree + DiffUtils // Markierung Nodes aufheben AWT, Swing, JavaFX & SWT 2
I JTree wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
M Swing JTree AWT, Swing, JavaFX & SWT 4
M Nodes in JTree nicht anzeigen AWT, Swing, JavaFX & SWT 0
T JTree mit Cloud verbinden AWT, Swing, JavaFX & SWT 0
H JTree Probleme AWT, Swing, JavaFX & SWT 9
F Swing Drag and Drop in JTree aus verschiedenen Listen AWT, Swing, JavaFX & SWT 6
M JButton wird von JTree überdeckt AWT, Swing, JavaFX & SWT 4
J Auf Dateien in JTree zugreifen AWT, Swing, JavaFX & SWT 15
F jTree.startEditingAtPath(path); funktioniert nicht bei eigenem CellEditor? AWT, Swing, JavaFX & SWT 8
D Swing JTree Steuerung AWT, Swing, JavaFX & SWT 11
S Swing JTree verwirrt mich AWT, Swing, JavaFX & SWT 2
T JTree - Elemente mit Doppelklick auswählen AWT, Swing, JavaFX & SWT 6
J JTree speichern AWT, Swing, JavaFX & SWT 4
N Swing JTree TreeCellRenderer mit html und automatischen Zeilenumbruch AWT, Swing, JavaFX & SWT 8
O Swing JTree um Label (oder Panel) erweitern AWT, Swing, JavaFX & SWT 9
T JTree, Knoten mehrmals verwenden AWT, Swing, JavaFX & SWT 5
B JTree mit Ordneransicht in JPanel einbinden AWT, Swing, JavaFX & SWT 4
D JTree node reagiert bei Klick nicht immer AWT, Swing, JavaFX & SWT 2
M Swing JTree: Wie kann ich die Hintergrundfarbe der selection ändern?!?! AWT, Swing, JavaFX & SWT 7
D Mehrmals auf Node im JTree klicken AWT, Swing, JavaFX & SWT 2
D JSplitPane, Jtree, CardLayout (constraint must be a string) AWT, Swing, JavaFX & SWT 9
N Swing FileFilter lässt JTree sich nicht öffnen AWT, Swing, JavaFX & SWT 2
X Swing 2 TreeModel und ein JTree synchronisieren AWT, Swing, JavaFX & SWT 3
N Swing JTree TreePath zu Windows Pfad? AWT, Swing, JavaFX & SWT 2
RELAXccc Swing JTree + JScrollPane, refresh Problem AWT, Swing, JavaFX & SWT 17
X Swing JTree aktualisieren AWT, Swing, JavaFX & SWT 2
V Swing JTree - Umbenennen selbst handlen. AWT, Swing, JavaFX & SWT 2
E Übergebenem JTree Blätter hinzufügen AWT, Swing, JavaFX & SWT 2
E Wert eines selektierten Knotens in einem JTree auslesen AWT, Swing, JavaFX & SWT 3
A Swing JTree - Nodes expanden AWT, Swing, JavaFX & SWT 2
D JTree nach Klick auf einen Hyperlink aktualisieren AWT, Swing, JavaFX & SWT 3
B JTree AWT, Swing, JavaFX & SWT 9
T Menüacceleratoren verschwinden bei JTree AWT, Swing, JavaFX & SWT 5
1 Swing JTree collapse child nodes AWT, Swing, JavaFX & SWT 4
B JTree - sehr individuell AWT, Swing, JavaFX & SWT 3
G Swing JTree - Verbindungslinien entfernen AWT, Swing, JavaFX & SWT 4
A Swing Herausfinden ob bei JTree Klick auf "+"/"-" anahnd x,y AWT, Swing, JavaFX & SWT 2
S Swing JTree und seine Listener... AWT, Swing, JavaFX & SWT 4
L Swing JTree wird nicht selektiert AWT, Swing, JavaFX & SWT 2
P [JTree] Markierhilfe der Drop-Location selber gestalten. AWT, Swing, JavaFX & SWT 4
A JTree aus Pfaden erzeugen AWT, Swing, JavaFX & SWT 3
K Swing Hilfe beim JTree! AWT, Swing, JavaFX & SWT 3
X Datensätze in JTree AWT, Swing, JavaFX & SWT 2
L Update JTree Verzeichnisse AWT, Swing, JavaFX & SWT 9
E JTree Auswahl AWT, Swing, JavaFX & SWT 2
K JTree width der Treenodes auf 100% AWT, Swing, JavaFX & SWT 6
C JTree LastSelectedPathComponent benutzen? AWT, Swing, JavaFX & SWT 3
S Swing JTree Node Text nicht richtig angezeigt AWT, Swing, JavaFX & SWT 2
Landei Swing JTree mit "Tabellenzeilen"? AWT, Swing, JavaFX & SWT 5
Rudolf Swing JTree Node anhand vom Namen finden AWT, Swing, JavaFX & SWT 4
S JTree Elemente nach BaumLevel abspeichern AWT, Swing, JavaFX & SWT 2
Z JTree rootChilds AWT, Swing, JavaFX & SWT 2
D JTree DefaultMutableTreeNode ActionPerformed AWT, Swing, JavaFX & SWT 3
T JTree Daten in DB schreiben am besten SQL AWT, Swing, JavaFX & SWT 21
O JTree/TreeModel/DefaultMutableTreeNodes thread safe machen AWT, Swing, JavaFX & SWT 3
J Lazy Loading eine JTree während Scrollen AWT, Swing, JavaFX & SWT 11
S JTree & JComboBox - Elemente übers Fenster hinaus anzeigen AWT, Swing, JavaFX & SWT 9
E Swing JTree AWT, Swing, JavaFX & SWT 2
J Swing Lazy Loading in JTree wenn gescrollt wird AWT, Swing, JavaFX & SWT 3
N Knotenanordnung in JTree AWT, Swing, JavaFX & SWT 4
S JTree mit Liste zur Speicherung AWT, Swing, JavaFX & SWT 3
S Jtree CheckNode mit JPanel AWT, Swing, JavaFX & SWT 32
G JTree entfernt Nodes nicht AWT, Swing, JavaFX & SWT 12
C Swing JTree und TreeModel AWT, Swing, JavaFX & SWT 15
S Swing JTree wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
J JTree AWT, Swing, JavaFX & SWT 2
R [JTree/DefaultTreeCellRenderer] eigenes Renderer-Panel, so breit wie der JTree AWT, Swing, JavaFX & SWT 2
S Swing JTree mit KeyListener AWT, Swing, JavaFX & SWT 2
E Swing JTree setSelectedPath funktioniert nicht?! AWT, Swing, JavaFX & SWT 5
E JTree Autoscroll bei Drag and Drop AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben