JTree Knoten Öffnen - PER Programm

Status
Nicht offen für weitere Antworten.

pro_evo

Aktives Mitglied
Hi all,


ich habe links einen JTree und Rechts im Split Pane ein JTable, das die Dateien anzeigt.
(wie im Datei Explorer)

Man kann nun nicht nur durch klicken auf die Knoten den Table verändern, sondern auch wenn man im Table auf einen Ordner klickt .

Jetzt mächte ich den JTree anpassen sprich den jeweiligen Knoten öffnen ... ich habe eigentlich alles was ich brauche also was geklickt wurde, aber mit welcher Methode öffne ich den passenden Knoten ?

hier meine Fehlsversuche :

Code:
tab.addMouseListener (new MouseAdapter() {
			public void mouseClicked(MouseEvent e)  {
				String geklickt = ((ordnerTable)tab).reinDa();
				System.out.println("Geklickt: "+geklickt);
				//TreePath []neu = {aktuell,new TreePath(geklickt)};
				//baum.setSelectionPaths(neu); // erzeugt EVENT ?? ROFL -> KOTZ
				
				//TreePath neu = new TreePath (geklickt);
				//baum.setAnchorSelectionPath(neu); 
				// MAN WIE KANN ICH DEN SCH*** TREE MAL ÄNDERN !!
				};
			});

vielen Dank im Voraus
 
danke gut zu wissen 🙂

Jetzt müsste ich nur noch den TreePath richtig aufbauen koennen ....


Diese Methode is ja leider protected (weiß der Liebe Gott warum) 🙁
Code:
protected 	TreePath(TreePath parent, Object lastElement)
          Constructs a new TreePath, which is the path identified by parent ending in lastElement.
Aber genau die würde ich - glaube ich - brauchen oder ?

Das hab ich zur Verfügung :
Code:
System.out.println("Geklickt: "+geklickt);		
				aktuell = baum.getSelectionPath();
				TreePath neu = new TreePath (geklickt);
System.out.println("Neu:"+neu+"  Aktuell: "+aktuell);

und das kommt als Ausgabe :
Code:
Geklickt: Internet
Neu:[Internet]  Aktuell: [E:\, Documents]
 
hmm ok habs Selbst versucht ,umständlich aber Müsste gehen :


Code:
String geklickt = ((ordnerTable)tab).reinDa();
				System.out.println("Geklickt: "+geklickt);
			
				//baum.setSelectionPaths(neu); // erzeugt EVENT ?? ROFL -> KOTZ
				
				aktuell = baum.getSelectionPath(); // TreePath
				System.out.println("Aktuelles PfadFeld: "+aktuell);
				int pfadZahl = aktuell.getPathCount();
				
				Object []pfadFeld = new Object[pfadZahl+1];
				for (int i =0; i<pfadZahl; i++) {
					pfadFeld[i] = aktuell.getPathComponent(i);
				}
				// Letztes von Hand rein:
				pfadFeld[pfadZahl] = geklickt;
				TreePath neu = new TreePath(pfadFeld);
				
				System.out.println("Neues PfadFeld: "+neu);

				
				baum.expandPath(neu);

Die Ausgabe sieht korrekt aus, trotzdem wirft das Programm ne Exception 🙁

Code:
Geklickt: Bundesliga_Rotating_ Adboards
Aktuelles PfadFeld: [E:\, Downloads, PES4]
Neues PfadFeld: [E:\, Downloads, PES4, Bundesliga_Rotating_ Adboards]
java.lang.ClassCastException
	at javax.swing.tree.DefaultTreeModel.isLeaf(Unknown Source)
	at javax.swing.JTree.expandPath(Unknown Source)

Woran liegt das ?
 
niemend ne Lösung ?

hier mein neuster Versuch , er klappt zwar aber is teilweise verbuggt, weil halt der aktuell Tree Patch manchmal auch nen anderer is wenn man im Tree was anderes markiert hat 🙁

Code:
public void mouseClicked(MouseEvent e)  {
				int row = ((ordnerTable)tab).reinDa(); // int row = JTable.getSelectedRow();
				System.out.println("ROW: "+row);
				if (row != -1 ) {
					aktuell = baum.getSelectionPath(); // TreePath
					
					if (aktuell == null) 
						baum.setSelectionRow(0);
						
					TreePath neu = aktuell.pathByAddingChild(myNode.getChildAt(row));
					baum.expandPath(neu); 
					
					lab.setText(neu.toString());
				}
				else lab.setText("Hast auf ne Datei geklickt.");
 
Die Vorgehensweise über JTree#expandNode(TreePath path) ist ja richtig. Den Path musst du dir natürlich selbst zusammenstricken.

Ich nutze immer eigene Implementierungen von TreeModel und meine Objekte führen selbst Buch über ihre Beziehungen. So hole ich mir einfach meinen Ziel-Node (habe ja die Daten ja meis irgendwo in einer Collection stehen) und baue mir den path über Objekt#getParent() zusammen. Der ist dann natürlich falschrum, wird einmal gedreht, TreePath draus gemacht - lá voilá!

Ist ne Sache von ein paar Zeilen Code. Da man sowas öfter mal braucht bietet es sich an seinem eigenen Model eine passende Methode TreePath getPathToRoot(Objekt obj) zu verpassen.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben