JTree Knoten schliessen

Status
Nicht offen für weitere Antworten.

Pingu

Mitglied
Hallo zusammen

Habe bisher nicht im Forum gefunden was mich weiterbringt.

Also folgendes:

Ich habe einen JTree. Wenn der Benutzer nun über eine Suche ein Element sucht, werden alle zutreffenden Elemente im Baum aufgeklappt und selektiert.

Setzt er eine neue Suche ab so müssen vorher alle offenen Knoten wieder geschlossen werden.

Habe das mal was mit JTree.collapsePath(...) ausprobiert wobei ich ihm alle selektierten Pfade mitgegeben habe.

Wenn der Benutzer aber inzwischen die Selektion wechselt, dann werden die offenen Knoten nicht geschlossen.

Hat von euch jemand eine Lösung oder Idee?

Gruss
 

Ebenius

Top Contributor
Ich habe das Problem noch nicht richtig verstanden.
Wenn der Benutzer aber inzwischen die Selektion wechselt, dann werden die offenen Knoten nicht geschlossen.
Wann ist "inzwischen"? Was ist genau das Verhalten das Du möchtest? Hilft vielleicht ein bisschen Quelltext weiter?

Ebenius
 

Pingu

Mitglied
Ich habe das Problem noch nicht richtig verstanden.

Wann ist "inzwischen"? Was ist genau das Verhalten das Du möchtest? Hilft vielleicht ein bisschen Quelltext weiter?

Ebenius


Also der Benutzer sucht Beispielsweise Apfel

Code:
+Frucht
  |> Apfel
     |> Frischer Apfel
  |> Banane
+Gemüse

So wird ihm hier "Apfel" und "Frischer Apfel" selektiert.

Nun will er eine zweite Suche absetzten so werden vorher alle Knoten Elemente geschlossen. Also man sieht nur noch.

Code:
+Frucht
+Gemüse

Wenn der Benutzer aber zwischend der ersten und zweiten suche noch "Gemüse" öffnet und Tomate auswählt.


Code:
+Frucht
  |> Apfel
     |> Frischer Apfel
  |> Banane
+Gemüse
  |> Tomate
  |> Kürbis

So wird "Gemüse" geschlossen aber "Apfel" und "Frucht" nicht mehr.

Was ich nun will, dass bei einer neuen Suche der ganze Baum geschlossen wird und zwar auch alle offenen Knoten.

Klar?

Code:
	private void collapseTree(){
		TreePath[] selectedPaths = getFrame().getDocTypeTree().getSelectionPaths();
		for(TreePath path : selectedPaths){
			getFrame().getDocTypeTree().collapsePath(path.getParentPath());
		}
	}
 

Ebenius

Top Contributor
Du willst also einfach alle Knoten schließen die offen sind? Egal was sonst noch passiert ist? Das hättest Du oben wirklich weniger ausschweifend erklären können. :)

Das geht in etwa so: [HIGHLIGHT="Java"]/** Collapses the whole tree */
public void collapseAll(JTree tree) {
final TreeModel tm = tree.getModel();
final Object root = tm.getRoot();

/* nothing to expand, if no root */
if (root != null) {
collapseAllPaths(tree, new TreePath(root));
}
}

/**
* Collapses all paths in the given node and all nodes below that.
*
* @param path the tree path to the node to collapse
* @see JTree#expandPath(TreePath)
*/
public void collapseAllPaths(JTree tree, TreePath path) {
final TreeModel treeModel = tree.getModel();
tree.cancelEditing();
tree.collapsePath(path);
final Object node = path.getLastPathComponent();
final int n = treeModel.getChildCount(node);
for (int index = 0; index < n; index++) {
final Object child = treeModel.getChild(node, index);
if (!treeModel.isLeaf(child)) {
collapseAllPaths(tree, path.pathByAddingChild(child));
}
}
}[/HIGHLIGHT]
Ebenius
 

Pingu

Mitglied
Code:
public void search(String doctype) {
		if(doctype.isEmpty())
			return;
		
		collapseTree(getFrame().getDocTypeTree());
		getFrame().getDocTypeTree().clearSelection();
		if(doctype.startsWith("*")){
			if(doctype.endsWith("*")){
				doctype = doctype.replace("*", "");
				for (DocType myDocType: myDoctypeList) {
					if(myDocType.getBezeichnungDt().toLowerCase().contains((CharSequence)doctype.toLowerCase())){
						getFrame().getDocTypeTree().addSelectionPath(myDocType.getTreePath());
					}
				}
			}else{
				doctype.replace("*", "");
				for (DocType myDocType: myDoctypeList) {
					if(myDocType.getBezeichnungDt().toLowerCase().endsWith(doctype.toLowerCase())){
						getFrame().getDocTypeTree().addSelectionPath(myDocType.getTreePath());
					}
				}
			}
		}
		else if(doctype.endsWith("*")){
			doctype = doctype.replace("*", "");
			for (DocType myDocType: myDoctypeList) {
				if(myDocType.getBezeichnungDt().toLowerCase().startsWith(doctype.toLowerCase())){
					getFrame().getDocTypeTree().addSelectionPath(myDocType.getTreePath());
				}
			}	
		}
		else{
			for (DocType myDocType: myDoctypeList) {
				if(myDocType.getBezeichnungDt().toLowerCase().equals(doctype.toLowerCase())){
					getFrame().getDocTypeTree().addSelectionPath(myDocType.getTreePath());
				}
			}	
		}
	}
	
	private void collapseTree(JTree tree){
		final TreeModel tm = tree.getModel();
		final Object root = tm.getRoot();
		
		if (root != null) {
			collapseAllPaths(tree, new TreePath(root));
		}
	}
	
	public void collapseAllPaths(JTree tree, TreePath path) {
		final TreeModel treeModel = tree.getModel();
		
		tree.cancelEditing();
		tree.collapsePath(path);
		
		final Object node = path.getLastPathComponent();
		final int n = treeModel.getChildCount(node);
		
		for (int index = 0; index < n; index++) {
			final Object child = treeModel.getChild(node, index);
			if (!treeModel.isLeaf(child)) {
				collapseAllPaths(tree, path.pathByAddingChild(child));
			}
		}
	}
 

Ebenius

Top Contributor
Geht das auch nicht, wenn Du erst die Selektion leer machst und danach die Knoten schließt?

Ebenius
 

Pingu

Mitglied
Funktioniert nun teils.

Seltsam ist nur, dass ein Knoten immer geöffnet wird obwohl das gesuchte Element nicht vorhanden ist.

Und zusätzlich wird, wenn bei der Suche kein Treffer erfolgt das Model nicht mehr aufbereitet ich habe also einen leeren JTree.
 

Pingu

Mitglied
Funktioniert nun teils.

Seltsam ist nur, dass ein Knoten immer geöffnet wird obwohl das gesuchte Element nicht vorhanden ist.

Und zusätzlich wird, wenn bei der Suche kein Treffer erfolgt das Model nicht mehr aufbereitet ich habe also einen leeren JTree.

Das zweite Problem mit dem Model hab ich gelöst. Wieso er aber ein Knoten immer öffnet bleibt mir ein Rätsel.
 

Ebenius

Top Contributor
Hmm. So kann ich Dir erstmal nicht weiter helfen. Lass Dir doch mal alle geschlossenen Pfade ausgeben und schau mal, ob der der am Ende offen ist auch dabei ist. Vielleicht öffnest Du den Pfad woanders nochmal??? Keine Ahnung.

Ebenius
 

Pingu

Mitglied
Ich habe nun mit getExpandedDescendants herausgefunden, dass der Knonten nach dem Schliessen aller Knoten geöffnet ist. Was ja klar war.

Habe dann versucht mit Breakpoints auf die Methoden expandPath und expandRow zu schauen wann der Knoten geöffnet wird. Sie wird mit diesem Knoten aber nie aufgerufen :S
 

Ebenius

Top Contributor
Du könntest noch im BasicTreeUI nach "treeState.setExpandedState(path, true);" suchen und die Stellen debuggen.

Ebenius
 

Pingu

Mitglied
So Lösung gefunden:

[HIGHLIGHT="Java"]
public void collapseAll(JTree tree) {
int row = tree.getRowCount() - 1;
while (row >= 0) {
tree.collapseRow(row);
row--;
}
}
[/HIGHLIGHT]
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
G JTree Knoten ein / ausblenden AWT, Swing, JavaFX & SWT 3
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
masta // thomas JTree - Knoten ausblenden. AWT, Swing, JavaFX & SWT 3
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
D Knoten in JTree ausblenden. AWT, Swing, JavaFX & SWT 12
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
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
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

Ähnliche Java Themen

Neue Themen


Oben