Swing Initialisierung des JTree

XFlipX

Aktives Mitglied
Hallo,

ich habe mal wieder ein Problem:

Und zwar, ich habe in meiner Applikation ein Panel in dem eine ScrollPane liegt in welcher wieder ein JTree liegt. Beim Start wird alles initialisiert und angezeigt. Zusätzlich habe ich eine Liste, die ich während der Laufzeit mit Dateien fülle. Über einen Doppelklick auf diese Dateien wird mir die interne Struktur der Datei im JTree angezeigt.

Das Problem ist jetzt, die Anfangsinitialisierung des JTree. Was ich meine: Beim Start / bei der Instanzierenug des JTree -> entweder ich weise dem JTree ein eigenes Model zu oder er nimmt das DefaultTreeModel. Ich bin also dazu verdammt im JTree schon im Vornherein was anzuzeigen, obwohl in meiner FileListe noch gar keine Dateien reingeladen wurden bzw. durch Doppelklick die Anweisung erfolgte, die Struktur der Datei im JTree zu visualisieren.

Wie könnte ich das lösen ?

Noch eine Frage:

Auf Doppleklick soll ja die Struktur-Visualisierung der Datei im Tree erfolgen. Ich habe das so gelöst, dass ich innerhalb der mouseClicked - Methode das Model für meinen JTree neu setze -> mit meinem eigenen Model + dateispezifischen Root-Node das ich vom Parser bekomme. Ist das eine saubere Lösung ? Also das ständige Neusetzen des Models.

Danke, XFlipX
 

KrokoDiehl

Top Contributor
Wenn du ohnehin dein eigenes TreeModel hast, dann kannst du es doch dem JTree zu Beginn übergeben, auch wenn es leer ist.
Für die Aktualisierung müsste es schließlich auch genügen, wenn du "nur" die Wurzel jedes Mal neu setzt. Mit einem entsprechenden Ereignis wird der Baum dann ohnehin neu gezeichnet. Aber soweit ich das kenne ist das Neusetzen des Modells bei einer Tabelle "schlimmer" als beim Baum, von daher: Wenn du bisher mit dem Verhalten zufrieden bist, sehe ich auch keinen wirklichen Handlungsbedarf.
 

XFlipX

Aktives Mitglied
Das wäre ne Möglichkeit. Aber leeres TreeModel verstehe ich nicht. Mein TreeModel Konstruktor erwartet die Übergabe des WurzelKnotens vom Parser, den ich dann an den WurzelKnoten der Instanz vom TreeModel zuweise .

Java:
public SGTreeModel(SGNode root)
	{
		//Übergabe an das root der Instanz von SGTreeModel
		this.root = root;
	}

Müsste ich dann halt noch den StandardKonstruktor implementieren oder ?

Wie kann ich denn im Nachhinein die Wurzel meines Models neu setzen ? Muss ich dann das root auf public static setzen ?

Danke, XFlipX
 

KrokoDiehl

Top Contributor
Wie kann ich denn im Nachhinein die Wurzel meines Models neu setzen ? Muss ich dann das root auf public static setzen ?
Aua!
Nein bitte nicht ;) lieber über einen Setter machen. Hast du dein TreeModel von DefaultTreeModel geerbt? Wenn ja könnte dein Setter wie folgt aussehen:
Java:
public void setRoot(SGNode root)
{
    this.root = root;
    this.fireStructureChanged(
        this.root, 
        new Object[]{this.root},
        null,
        null);     
    // ok, bei den Parametern hier bin ich mir nicht so 100%ig sicher
}

Zu deinem anderen Problem: Ja du könnstest einen Standardkonstruktor hinzunehmen, oder
Code:
null
übergeben. Dann musst du natürlich im Modell sicherstellen, dass
Code:
null
-Zugriffe abgefangen werden. Ansonsten erstellst du einen Dummy-SGNode der z.B. nur "(Leer)" anzeigt. Sowas wie:
Java:
JTree myTree = new JTree( new SGTreeModel( new SGNode("(Leer)") ) );
 

KrokoDiehl

Top Contributor
Dann musst du selbst so ein Ereignis auslösen. In dem Fall ist das wichtig, damit der JTree nämlich auf eine Änderung reagieren kann und automatisch z.B. ein
Code:
repaint()
macht.
 

XFlipX

Aktives Mitglied
Hallo,

Konstruktor:

Java:
public SGTreeModel(SGNode root)
	{
		//Listener adden und Instanzieren einer eigenen Listener-Klasse
		this.addTreeModelListener(new MyTreeModelListener());
		
		//Übergabe an das root der Instanz von SGTreeModel
		this.root = root;
	}

und die innere Klasse implementiert das TreeModelListener Interafce womit ich wieder die 4 Methoden bekomme.

Java:
public class MyTreeModelListener implements TreeModelListener 
	{

		@Override
		public void treeNodesChanged(TreeModelEvent e){
			// TODO Auto-generated method stub
			
		}

		@Override
		public void treeNodesInserted(TreeModelEvent e){
			// TODO Auto-generated method stub
		}

		@Override
		public void treeNodesRemoved(TreeModelEvent e){
			// TODO Auto-generated method stub
			
		}

		@Override
		public void treeStructureChanged(TreeModelEvent e)
		{	
		}	
	}

Tja, hier habe ich erstmal nur -> die Reaktion auf ein Ereignis aber das Ereignis selber muss ja noch ausgelöst werden. Dazu brauche ich die fireStructureChanged Methode oder ?

XFlipX
 

KrokoDiehl

Top Contributor
Oh, um Missverständnissen vorzubeugen:
Du implementierst TreeModel in deinem SGTreeModel, d.h. du musst auch die Methoden
Java:
void addTreeModelListener(TreeModelListener l);
void removeTreeModelListener(TreeModelListener l);
implementieren.
Dies bedeuted, dass du in deinem Modell irgendwie verwalten musst, welche (externen) Listener sich bei deinem Modell anmelden.

Wenn du nämlich einen JTree erstellst und ihm dein Modell gibst, dann hängt er sich als TreeModelListener daran und ruft die
Code:
add...
-Methode auf.
Wenn du in deinem Modell etwas änderst und diese Änderungen für die Außenwelt (zB den JTree) relevant sind, dann musst du dies den TreeModelListeners mitteilen, die bei deinem Modell lauschen.

Dazu kann ich mal folgende Quellen nennen:
Thread hier im Forum <-- eigener Thread von mir bzgl. EventListenerList und eigener Verwaltung
EventListenerList API

Generell sieht so etwas in Swing wie folgt aus:
Java:
public class MyBLAModel implements BLAModel
{
    protected transient EventListenerList listeners = new EventListenerList();
    
    @Override
    public void addBLAListener(BLAListener listener)
    {
        listeners.add(BLAListener.class, listener);
    }

    @Override
    public void removeBLAListener(BLAListener listener)
    {
        listeners.remove(BLAListener.class, listener);
    }

    //...

    protected void fireBLAEvent(BLAData data)
    {
        //vgl. obige Links
        Object[] blaListener = listeners.getListenerList();
        for (int i = blaListener.length-2; i >= 0; i -= 2)
        {
            if (blaListener[i] == BLAListener.class)
            {
                ((BLAListener)blaListener[i+1].blaHappend( new BLAEvent(data) );
            }
        }
    }

    // ...

    public void updateBLA(BLA bla)
    {
        // sonstwas im Modell anstellen

        // Änderungen nach außen mitteilen
        this.fireBLAEvent(blabla);
    }        
}

In deinem konkreten Fall müsstest du solch eine
Code:
fire
-Methode aufrufen, wenn du die Wurzel austauschst (bzw. generell irgendeinen Knoten änderst).
 

XFlipX

Aktives Mitglied
Hallo,

danke für die Ansätze, die ich leider noch nicht vollständig verstehe. Was übergibst du denn der fireBLAEvent -Methode für Daten ?

Und was bedeutet genau diese Zeile:

Java:
((BLAListener)blaListener[i+1].blaHappend( new BLAEvent(data) );

bzw. was macht oder sollte die blaHappend Methode machen ?

Änhlich die Update - Methode -> Was übergibst du dieser Methode an Daten

XFlipX
 

KrokoDiehl

Top Contributor
Hm... mit dem "bla" wollte ich nur das gängige "foo" umgehen ;)

Also das "bla" ist ein Platzhalter für den jeweiligen Listener-Typ. In deinem Fall also dem TreeModelListener.
Ein TreeModelListener hat - wie es dir die API bestimmt schon erklärt hat - einige Methoden. Eine davon ist die
Code:
void treeStructureChanged(TreeModelEvent e)
die du, meiner Ansicht nach, beim Neusetzen der Wurzel benachrichtigen solltest.
Konkret müsste die Methode bei dir dann etwa wie folgt aussehen:
Java:
protected void fireTreeStructureChanged( Object[] path )
{
    Object[] treeListener = listeners.getListenerList();
    // Code mit der for-Schleife
        ((TreeModelListener)treeListener[i+1]).treeStructureChanged(new TreeModelEvent(this, path));
        // "path" dürfte in dem Fall ein 'new Object[]{meineNeueWurzel}' sein
    //...        
}

Oder um es allgemein zu formulieren: Wenn du ein eigenes TreeModel implementierst, dann musst du auch die TreeModelListener verwalten können, die sich an dein Modell hängen. Ob du das über die gegebene Klasse EventListenerList oder über ein eigenes Array, oder eine ArrayList oder sonstwas machst, ist erst einmal egal.
Wenn nun in deinem Modell irgendwas verändert wird, oder dort etwas passiert, von dem die Listener (--> Zuhörer) mitbekommen sollten (z.B. weil sich der JTree neu zeichnen muss), dann muss du all die Listener, die sich zur Laufzeit via
Code:
addXXXListener()
an dein Modell gehängt haben, darüber benachrichtigen. Wie genau, das hängt vom jeweiligen Listener und der Art der Änderung ab. Wenn man sich die Methoden vom TreeModelListener mal anschaut, dann sagen deren Namen schon gut genug aus, wann man sie benachrichtigen sollte.

Viele Implementierungen in Swing haben dafür bereits Methoden, die alle mit
Code:
fireXXX()
benannt sind, wie z.B. das DefaultTreeModel, sodass es einfacher ist von solchen Klasse zu erben, da man sich um die Verwaltung von Listenern und das Auslösen von Events nur noch bedingt selbst kümmern muss.
Ansonsten muss man das natürlich selbst machen, so wie in deinem Fall. Wenn du nämlich die Wurzel im Modell einfach austauschst, und es dem JTree nicht sagst, dann macht der auch nichts. Und die Art und Weise, in der Swing derartiges handhabt ist über das Listener-Prinzip.
 

XFlipX

Aktives Mitglied
Nochmals danke für die Hilfe und die Gedult. Es funktioniert nun. Für mein erstes Problem habe ich mir ein DummyNode angelegt, was ich meinem Model übergebe. Das zweite Problem habe ich nun auch gelöst -> jetzt brauche ich nur noch den WurzelKnoten in meinem Model neu setzen.

Die nächsten Frage kommen bestimmt.

XFlipX
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
MiMa JavaFX Fenster in JavaFX öffnen Schliessen (Initialisierung) AWT, Swing, JavaFX & SWT 20
K Initialisierung von Oberfläche Richtig? AWT, Swing, JavaFX & SWT 5
C Swing Reihenfolge der Initialisierung von Komponenten AWT, Swing, JavaFX & SWT 6
M Probleme bei Initialisierung von JTabbedPane AWT, Swing, JavaFX & SWT 4
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
G 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
S JTree aus List<File> erstellen AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben