JTree.setSelectionPath() klappt nicht

  • Themenstarter Themenstarter Christian76
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
C

Christian76

Gast
Hallo,

ich versuche verzweifelt einen vorher ausgewählten Node aus einem JTree in ein neues Fenster mit einem JTree zu übertragen und ihn dort anzeigen zu lassen.

Hier im Beispiel mache ich nix anderes, auch hier funktioniert es nicht.

Code:
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.tree.TreePath; 


public class TreeSelectTest extends JFrame 
{ 
   TreeSelectTest(TreePath path) 
   {       
      final JTree tree = new JTree(); 
       
      // Wenn Pfad vorher ausgewählt, dann soll er dahin springen! 
      if(path != null) 
         tree.setSelectionPath(path); 
          
        MouseListener ml = new MouseAdapter() { 
            public void mousePressed(MouseEvent e) { 
                int selRow = tree.getRowForLocation(e.getX(), e.getY()); 
                TreePath selPath = tree.getPathForLocation(e.getX(), e.getY()); 
                if(selRow != -1) { 
                    if(e.getClickCount() == 2) 
                    { 
                       // Hier wird der Pfad ausgewählt 
                        new TreeSelectTest(selPath); 
                    } 
                } 
            } 
        }; 
        tree.addMouseListener(ml); 
       
      this.add(new JScrollPane(tree)); 
      this.pack(); 
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      this.setVisible(true); 
   } 
    
   public static void main(String[] args) 
   { 
      new TreeSelectTest(null); 
   } 
}

Ich hoffe ihr könnt mir da helfen

Gruß
 
So ein Pfad muss die Knoten des Baumes beinhalten. Aber wenn du zwei verschiedene Bäume hast, dann haben die (meist) auch verschiedene Knoten. Es geht dabei nicht um den angezeigten Text, sondern um die Objekte welche Knoten sind (nicht equals zählt, == zählt).
 
was mich so ein bischen stutzig macht, der Pfad (unabhängig davon welche Objekte im JTree sind) zu den Knoten ist der gleiche. Es müsste aber angezeigt werden. denke ich. Kompilier den Code mal.
 
Füge mal das hier in den Code ein:
Code:
        final JTree tree = new JTree();

        TreeModel model = tree.getModel();
        DefaultMutableTreeNode root = (DefaultMutableTreeNode)model.getRoot();
        System.out.println( root.hashCode() );
Wenn du das ausführst, wirst du sehen, dass jedesmal eine andere Zahl gedruckt wird wenn ein JTree geöffnet wird.
Das bedeutet, dass der Wurzelknoten in den verschiedene JTrees auch tatsächlich ein anderes Objekt ist.
Das wiederum bedeutet, dass ein TreePath von einem JTree in den anderen JTrees wertlos ist.

Sorg dafür, dass alle JTrees dasselbe TreeModel verwenden, und es wird funktionieren:
Code:
    public TreeSelectTest(TreeModel model, TreePath path)
    {       
        final JTree tree = new JTree();

        if( model != null )
            tree.setModel( model );
und
Code:
                        // Hier wird der Pfad ausgewählt
                        new TreeSelectTest(tree.getModel(), selPath);
 
whow, jo, dank dir. Da wäre ich nie drauf gekommen. Hat wunderbar geklappt, hier nochmal der Code.

Code:
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;

public class TreeSelectTest extends JFrame
{
	TreeSelectTest(TreePath path, TreeModel model)
	{		
		final JTree tree = new JTree();
		
	
		// Wenn Pfad vorher ausgewählt, dann soll er dahin springen!
		if(path != null)
		{
			tree.setModel(model);
			tree.setSelectionPath(path);
		}	
		
        MouseListener ml = new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                int selRow = tree.getRowForLocation(e.getX(), e.getY());
                TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
                if(selRow != -1) {
                    if(e.getClickCount() == 2) 
                    {
                    	// Hier wird der Pfad ausgewählt
                        new TreeSelectTest(selPath,tree.getModel());
                    }
                }
            }
        };
        tree.addMouseListener(ml);
		
		this.add(new JScrollPane(tree));
		this.pack();
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}
	
	public static void main(String[] args) 
	{
		new TreeSelectTest(null,null);
	}
}

Gruß und Dank!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben