Knoten in JTree ausblenden.

Status
Nicht offen für weitere Antworten.
D

Dust

Gast
Hallo, hab folgendes Problem...
Wie kann man bestimmte Knoten im JTree aus- und wieder einblenden?
Habe es in meinem TreeRendere schonmal mit setVisible() versucht, aber irgendwie scheint das meine Nodes nicht zu interessieren...
Hier mal mein TreeRenderer...
Code:
public MovieTreeRenderer()
  {
    super();
  }
  public Component getTreeCellRendererComponent(JTree tree,Object value,boolean sel,boolean expanded,boolean leaf,int row,boolean hasFocus)
  { 
    super.getTreeCellRendererComponent(tree,value,sel,expanded,leaf,row,hasFocus);
    String av = value.toString();
    if (leaf==true)
    {
      if (av.endsWith(" 0"))
      {
        setIcon(avail);
      }
      else
      {
        setIcon(notavail);
        setForeground(Color.red);
      }
    }
    if (av.startsWith("Geliefert"))
    {
      setIcon(infos);
      setForeground(Color.blue);
    }
    setClosedIcon(null);
    setOpenIcon(null);
    return this;
zur Info... Durch den value Text kann ich eindeutig bestimmen welches Icon davor muß, deswegen die ganzen av.startswith(..) und av.endwith(..)....
 

abollm

Top Contributor
Dust hat gesagt.:
Hallo, hab folgendes Problem...
Wie kann man bestimmte Knoten im JTree aus- und wieder einblenden?
Habe es in meinem TreeRendere schonmal mit setVisible() versucht, aber irgendwie scheint das meine Nodes nicht zu interessieren...
Hier mal mein TreeRenderer....

Wieso versuchst du das über einen Tree-Renderer und nicht über ein eigenes Tree-Model?
 

AlArenal

Top Contributor
Du baust dir ein TableModel, dass alle deine Daten enthält. Ein weiteres TableModel greift auf dieses dann zu und rechnet Indices, etc. um, um nur das anzuzeigen, was angezeigt werden soll. Das Model muss zudem TreeModelListener implementieren und am Haupt-Model lauschen, die Events passend umrechnen und an die eigenen Listener (den JTree) weitergeben.

Ich habe sowas hier auch schon ein paar Wochen laufen. Aller Anfang war schwer, hinterhere hab ich mich aber gefragt, wo da jetzt das Problem war ;)
 
D

Dust

Gast
Jo, danke Al... Nach meinem Post gestern nacht hab ich deinen Thread dann auch noch gefunden :roll:
So ganz raus hab ichs noch nciht, aber im moment ist da größere problem das wenn ich alles in ne .jar datei packe das er mir den tree garnicht anzeigt... aber naja... mal schaun...
 

abollm

Top Contributor
AlArenal hat gesagt.:
Du baust dir ein TableModel, dass alle deine Daten enthält. Ein weiteres TableModel greift auf dieses dann zu und rechnet Indices, etc. um, um nur das anzuzeigen, was angezeigt werden soll. Das Model muss zudem TreeModelListener implementieren und am Haupt-Model lauschen, die Events passend umrechnen und an die eigenen Listener (den JTree) weitergeben.

Und was machst du, wenn du das unbedingt mit JTree implementieren musst?
 

AlArenal

Top Contributor
Ich verstehe die Frage nicht ganz.

Ah, oh.. großes SORRY! Ich meinte natürlich TreeModel, auch wenn ich TableModel geschrieben habe. Mea culpa

Ich habe in meiner Anwendung eine Erweiterung des JTrees, der auf ein eigenes TableModel zugreift, welches im Grunde nur als Filter agiert und als Datenquelle ein weiteres TableModel nutzt.

MyTree extends JTree <= MyFilter implements TreeModel, TreeModelListener <= MyModel implements TreeModel

Änderungen an den Daten (Änderungen im Node, Node hinzufügen, Node löschen, Struktur ändern) werden nach unten durchgereicht. Dort wird dann der passende Evbent erzeugt, der dann nach oben durchgereicht und dabei in MyFilter für MyTree passend umgerechnet wird. Lesezugriffe gehen durch den Filter.

So habe ich eine Anwendung realisiert (bzw. ich sehe zu sie bis zur Messe präsentationsfähig zu bekommen) wo ich mit verschiendenen Trees und Filtern unterschiedliche Teile derselben Daten anzeige.

Auf ne allgemeine Anwendung übertragen könnte man so z.B. einen Datei-Explorer realsieren, der wahlweise nur TXT-Dateien oder so anzeigt...

Der Grundgedanke (mit dem sog. delegate) ist universell für alle MVC-Strukturen verwendbar.
 
D

Dust

Gast
@Al

So, ich nochmal, das mit dem anzeigen hab ich gelöst (mir fehle ein Image in dem .jar File) dumdidum...
Aber das mit dem Model hab ich noch nicht so ganz....

Ich muß halt nur die Blätter ausblenden falls nötig... gesteuert werden solls über die Menüleiste des Desktops in Form einer CheckBox...
Hast vielleicht nen CodeSchnipsel für dieses TreeModel?

wei gesagt, blicke durch deinen anderen thread nich ganz durch, sorry.
 

AlArenal

Top Contributor
Also deine Version wäre noch eine Erweiterung von meiner, da meine TreeFilter (so nenne ich die) nicht volldynamisch arbeiten. Ich habe im Programm unterschiedliche Ansihten (JTrees), die immer dieselben Strukturen zeigen.

1.
Du fängst an mit einem normalen TreeModel, das alle deine Daten enthält. Wenn du das fertig hast, gehts weiter.
Code:
public class MyModel implements TreeModel {

    ...

}

2.
Nun bastelst du dir einen Filter.
Code:
public class MyFilter implements TreeModel{
    private TreeModel delegate;
   
    public MyFilter(TreeModel delegte) {
        this.delegate = delegate;
    }

    ...
}
Den Filter instanziierst du, indem du ihm eine Instanz von MyModel mitgibst.
Im Grunde kannst du zum Rumspielen nun jede Methode von TreeModel im Filter implementieren, indem du jeweils diegleiche Methode des delegates aufrufst.

3.
Danach kannste du Stück für Stück alles Benötigte im Filter umstellen, aber er ist dann schonmal soweit funktional, das man ihn live testen kann.

4.
Richtig lustig wird es, wenn sich Daten ändern. Normalfall: JTree implementiert von Haus aus TreeModelListener und macht ein treeModel.addTreeModelListener(this) für sein Model. Damit das Event-Handling zwischen Model, Filter und Tree funzt, darf man nun die ganzen entsprechenden Methoden implementieren.

4.1
Wir fangen mal damit an, Listener zu registrieren, bzw. Registrierung zu ermöglichen. Dazu bekommen MyModel und MyFilter beide folgenden Code hinzugefügt:
Code:
    ...

    Vector treeModelListeners;

    ...

    /**
     * @see javax.swing.tree.TreeModel#addTreeModelListener(javax.swing.event.TreeModelListener)
     */
    public void addTreeModelListener(TreeModelListener l) {
        // lazy initialization
        if (treeModelListeners == null) treeModelListeners = new Vector();            
        treeModelListeners.addElement(l);        
    }

    /**
     * @see javax.swing.tree.TreeModel#removeTreeModelListener(javax.swing.event.TreeModelListener)
     */
    public void removeTreeModelListener(TreeModelListener l) {
        if (treeModelListeners != null) {
            treeModelListeners.removeElement(l);
        }
    }

Zusätzlich verbinden wir den Filter mit dem Model:

Code:
    ...

    public MyFilter(TreeModel delegte) {
        this.delegate = delegate;
        delegate.addTreeModelListener(this);
    }

    ...

4.2
Weiter gehts mit dem Event-Handling. Model und Filter benachrichtigen ihre Listener mit folgenden Methoden über Änderungen (den Code findet man so im Netz), indem sie bestimmte Methoden im Listener aufrufen (die wir anschließend implementieren):

Code:
    ...

    /**
     * Notifies the model listeners of a treeNodesChanged event.
     * 


     *  Iterates through the current listener list, and calls the
     *  treeNodesChanged method for the listener. If the model listener throws an
     *  an exception or error it will be silently ignored and this method will 
     *  continue to dispatch the event until all listeners have been notified.
     * 
     * @see TreeModelListener#treeNodesChanged(javax.swing.event.TreeModelEvent)
     * @param e TreeModelEvent to dispatch.
     */
    public void fireTreeNodesChanged(TreeModelEvent e) {
        if (treeModelListeners != null) {
            Iterator itr = treeModelListeners.iterator();
            while (itr.hasNext()) {
                try {
                    TreeModelListener tm = (TreeModelListener) itr.next();
                    tm.treeNodesChanged(e);
                } catch (Throwable t) {
                }
            }
        }
    }
    
    /**
     * Notifies the model listeners of a treeNodesInserted event.
     * 


     *  Iterates through the current listener list, and calls the
     *  treeNodesInserted method for the listener. If the model listener throws an
     *  an exception or error it will be silently ignored and this method will 
     *  continue to dispatch the event until all listeners have been notified.
     * 
     * @see TreeModelListener#treeNodesInserted(javax.swing.event.TreeModelEvent)
     * @param e TreeModelEvent to dispatch.
     */
    public void fireTreeNodesInserted(TreeModelEvent e) {
        //log.debug("fireTreeNodesInserted()");
        if (treeModelListeners != null) {
            Iterator itr = treeModelListeners.iterator();
            while (itr.hasNext()) {
                try {
                    TreeModelListener tm = (TreeModelListener) itr.next();
                    tm.treeNodesInserted(e);
                } catch (Throwable t) {
                }
            }
        }
    }
    
    /**
     * Notifies the model listeners of a treeNodesRemoved event.
     * 


     *  Iterates through the current listener list, and calls the
     *  treeNodesRemoved method for the listener. If the model listener throws an
     *  an exception or error it will be silently ignored and this method will 
     *  continue to dispatch the event until all listeners have been notified.
     * 
     * @see TreeModelListener#treeNodesRemoved(javax.swing.event.TreeModelEvent)
     * @param e TreeModelEvent to dispatch.
     */
    public void fireTreeNodesRemoved(TreeModelEvent e) {
        if (treeModelListeners != null) {
            Iterator itr = treeModelListeners.iterator();
            while (itr.hasNext()) {
                try {
                    TreeModelListener tm = (TreeModelListener) itr.next();
                    tm.treeNodesRemoved(e);
                } catch (Throwable t) {
                }
            }
        }
    }
    
    /**
     * Notifies the model listeners of a treeStructureChanged event.
     * 


     *  Iterates through the current listener list, and calls the
     *  treeStructureChanged method for the listener. If the model listener throws an
     *  an exception or error it will be silently ignored and this method will 
     *  continue to dispatch the event until all listeners have been notified.
     * 
     * @see TreeModelListener#treeStructureChanged(javax.swing.event.TreeModelEvent)
     * @param e TreeModelEvent to dispatch.
     */
    public void fireTreeStructureChanged(TreeModelEvent e) {
        if (treeModelListeners != null) {
            Iterator itr = treeModelListeners.iterator();
            while (itr.hasNext()) {
                try {
                    TreeModelListener tm = (TreeModelListener) itr.next();
                    tm.treeStructureChanged(e);
                } catch (Throwable t) {
                }
            }
        }
    }

    ...

4.3
Damit das funzt, fehlen dem Filter als Listener noch die "Empfänger-Methoden" treeNodesChanged(...), treeNodesInserted(...), treeNodesRemoved(...), treeStructureChanged(...). Dafür muss der Filter das Interface javax.swing.event.TreeModelListener implementieren, so wie es ein JTree auch macht (okay, nicht genauso, denn der benutzt eine protected INstanz von TreeModelHandler):.

Code:
    ...

    /**
     * @see javax.swing.event.TreeModelListener#treeNodesChanged(javax.swing.event.TreeModelEvent)
     */
    public void treeNodesChanged(TreeModelEvent e) {}

    /**
     * @see javax.swing.event.TreeModelListener#treeNodesInserted(javax.swing.event.TreeModelEvent)
     */
    public void treeNodesInserted(TreeModelEvent e) {}

    /**
     * @see javax.swing.event.TreeModelListener#treeNodesRemoved(javax.swing.event.TreeModelEvent)
     */
    public void treeNodesRemoved(TreeModelEvent e) {}

    /**
     * @see javax.swing.event.TreeModelListener#treeStructureChanged(javax.swing.event.TreeModelEvent)
     */
    public void treeStructureChanged(TreeModelEvent e) {}
         
    ...

Deine Aufgabe ist es nun die TreeModelEvents umzubiegen. Löscht du im Model einen Node, benachrichtigt es seine Listener, übergibt ihm eine Referenz auf den gelöschten Node und dessen alte Position (den INdex) den er aus SIcht seines Parents hatte. Ist der benachrichtigte Listener dein Filter, muss der den Event an seine Listener (den JTree) weitergeben. Aus dessen Sicht war der Node aber möglicherweise gar nicht sichtbar (dann kannst du dir die Benachrichtigung sparen) oder aber er lag möglicherweise an einem anderen Index. Diesen musst du umrechnen (wie du es in den TreeModel-Methoden getIndexOfChild(), .. ja auch machen musst), einen neuen Event instanziieren und diesen an die Listener (den JTree) schicken.

Erweiterst du dein Model und denFilter z.B: um eine Methode remove(Object obj), dann lasse den Filter einfach nur die MEthode des delegates (also des Models) aufrufen. Das Model muss sich dann ums Löschen und das Auslösen des Events kümmern. Der Evetn selbst krabbelt dann die ganze Kette nach oben, bis er am JTree ankommt.
 
D

Dust

Gast
Thank you very much!!!
Werd mich am Wochenende gleich erstmal dran setzen, jetzt is n bissi spät... bei mir werden sich aber keine Daten mehr ändern (bis jetzt glaub ich das zumindest nicht) Also brauch ich das mit den ActionListenern doch eigendlich nicht, oder??ß Naja, aber schaden tut's ja auch nicht... wg. Erweiterbarkeit....

Trotzdem noch mal ganz gnaz großen Dank!!!
 

AlArenal

Top Contributor
Wenn die Daten sich in keinster Weise ändern, weder inhaltlich noch strukturell, dann isses natürlich deutlich einfacher.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G JTree Knoten ein / ausblenden AWT, Swing, JavaFX & SWT 3
masta // thomas JTree - Knoten ausblenden. AWT, Swing, JavaFX & SWT 3
richis-fragen JTree +/- verschwidet wenn Knoten keine Kinder hat... AWT, Swing, JavaFX & SWT 6
E Swing Copy und Paste eines einzelnen Knoten aus einem JTree AWT, Swing, JavaFX & SWT 1
N Swing JTree Problem beim erstellen der Knoten AWT, Swing, JavaFX & SWT 0
T JTree, Knoten mehrmals verwenden AWT, Swing, JavaFX & SWT 5
M JTree mit eigenen Knoten - Zugriff auf Daten AWT, Swing, JavaFX & SWT 6
C Knoten anzeigenb eim DnD in einem JTree AWT, Swing, JavaFX & SWT 4
H JTree - nach Auswahl aus JFileChooser wird nur der erste Knoten angezeigt AWT, Swing, JavaFX & SWT 3
Z Jtree Knoten ändern AWT, Swing, JavaFX & SWT 5
S JTree - Knoten mit animiertem GIF/Icon AWT, Swing, JavaFX & SWT 5
algorismi Knoten im JTree deaktivieren AWT, Swing, JavaFX & SWT 4
B JTree - pro Knoten kann nur ein Blatt eingefügt werden AWT, Swing, JavaFX & SWT 5
P JTree Knoten schliessen AWT, Swing, JavaFX & SWT 16
S JTree rendern der Knoten [+] und [-], nicht der Node Icons AWT, Swing, JavaFX & SWT 2
G JTree: mehrere Knoten selektieren! AWT, Swing, JavaFX & SWT 2
S JTree, Knoten anhand eines Pfades öffnen? AWT, Swing, JavaFX & SWT 2
S Blätter oder Knoten im JTree ordnen AWT, Swing, JavaFX & SWT 3
D JTree - Knoten einfügen und automatisch in den Editiermodus AWT, Swing, JavaFX & SWT 2
G JTree -- Node nach ändern in anderen Knoten AWT, Swing, JavaFX & SWT 15
L nur den JTree Knoten auf der Console ausgeben? AWT, Swing, JavaFX & SWT 6
W JTree, bei Drag Over über den Knoten "markieren" AWT, Swing, JavaFX & SWT 3
S JTree hinzugefügte Knoten anzeigen AWT, Swing, JavaFX & SWT 9
K Frage zu einem älteren Beitrag: JTree letzter Knoten auswähl AWT, Swing, JavaFX & SWT 2
G Knoten im Jtree mit unterscheidlichen Farben darstellen AWT, Swing, JavaFX & SWT 5
S Knoten im JTree hinzufügen/löschen mit eigenem Jtree AWT, Swing, JavaFX & SWT 8
R JTree: TreeCellRenderer und Selektion eines Knoten AWT, Swing, JavaFX & SWT 10
G JTree - einzelnen Knoten löschen AWT, Swing, JavaFX & SWT 11
M Freiraum zwischen Knoten im JTree AWT, Swing, JavaFX & SWT 14
B Sichtbare Knoten im aktuellen Viewport eines JTree AWT, Swing, JavaFX & SWT 4
P JTree Knoten Öffnen - PER Programm AWT, Swing, JavaFX & SWT 5
M JTree - Wie kann man einen einzelnen Knoten deselektieren? AWT, Swing, JavaFX & SWT 3
T Knoten in Jtree anders darstellen AWT, Swing, JavaFX & SWT 2
P JTree: Alle Knoten geöffnet anzeigen AWT, Swing, JavaFX & SWT 2
M Einen Knoten im JTree zusammenklappen? AWT, Swing, JavaFX & SWT 6
M JTree: Wie einen Knoten editieren? AWT, Swing, JavaFX & SWT 5
X JTree: Selektion nach dem Entfernen von Knoten AWT, Swing, JavaFX & SWT 2
W JTree Knoten oder Blatt AWT, Swing, JavaFX & SWT 3
W JTree löschen & überprüfen von Knoten oder Blatt AWT, Swing, JavaFX & SWT 3
W JTree Knoten irgendwo hinzufügen AWT, Swing, JavaFX & SWT 2
X JavaFX Tooltips für XYChart-Knoten werden nicht angezeigt! AWT, Swing, JavaFX & SWT 3
B Knoten, Kanten erzeugen AWT, Swing, JavaFX & SWT 4
D AWT Knoten für Graphen kreisförmig anordnen AWT, Swing, JavaFX & SWT 5
D Erste Knoten des JTrees bei Start offen AWT, Swing, JavaFX & SWT 8
T TreeViewer knoten manuell umsortieren AWT, Swing, JavaFX & SWT 4
J Knotenselect von bestimmten Knoten im Tree AWT, Swing, JavaFX & SWT 2
P Eindeutiger Knoten im Treeview AWT, Swing, JavaFX & SWT 3
F Tree-Knoten programmgesteuert auswählen 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
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
U dynamisches JTree erstellen AWT, Swing, JavaFX & SWT 2
J JTree updaten AWT, Swing, JavaFX & SWT 2
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
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

Ähnliche Java Themen

Neue Themen


Oben