MouseEvent bei einem JTree

BlockeR

Erfahrenes Mitglied
hallo leute,
habe ein kleines Problem mit meinem JTree.
Ich hatte vor bei meinem JTree ein MouseEvent drauf zu legen, so das ich, wenn ich mit der Maus über ein Element gehe oder auch darauf klicke, mir den Namen des angeklickten ausgibt...wie würde so eine Methode aussehen?
 
Hallo BlockeR,

dein Problem lässt sich ganz einfach lösen, in dem man an den Tree ein paar Lsitener anhängt:
Java:
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

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

/**
 * The Class TreeTest.
 */
public class TreeTest extends JFrame {

    /**
     * Create a new instance of <code>TreeTest</code>.
     */
    public TreeTest() {
        super("TreeTest");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        final JTree tree = new JTree();
        tree.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                final TreePath path = tree.getPathForLocation(e.getX(), e.getY());
                System.out.println("clicked: " + path);
            }
        });
        tree.addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseMoved(MouseEvent e) {
                final TreePath path = tree.getPathForLocation(e.getX(), e.getY());
                if (path != null) {
                    System.out.println("over: " + path);
                }
            }
        });
        getContentPane().add(new JScrollPane(tree));
    }

    /**
     * The main method.
     *
     * @param args the arguments
     */
    public static void main(String[] args) {
        final JFrame frame = new TreeTest();
        final Dimension frameSize = new Dimension(400, 250);
        frame.setSize(frameSize);
        final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        final int frameX = (screenSize.width - frameSize.width) / 2;
        final int frameY = (screenSize.height - frameSize.height) / 2;
        frame.setLocation(frameX, frameY);
        frame.setVisible(true);
    }
}

Grüße
Vincent
 
moin,
erstmal danke für den Code. Hast du noch ne Idee wie ich nur den Namen des Angeklickten bekomme, statt den ganzen Path? Muss ich da mit .split() arbeiten? Oder gibt es da ne andere Möglichkeit?
 
Zuletzt bearbeitet:
hier der Code. Aber leider wird hier der gesamte Pfad angezeigt.
Code:
	public void MouseMethode()
	{
		
		view.getTree().addMouseListener(new MouseAdapter() {

            @Override
			public void mouseClicked(MouseEvent e) {

                final TreePath path = getTree().getPathForLocation(e.getX(), e.getY());
                if(path == null)
                {
                	getTree().setSelectionRow(-1);
                	getfieldPath().setText("");
                }
                else
                {
                String stringPath = path.toString();
                getfieldPath().setText(stringPath);



                }
             }

        });
	}
 
Jo, genau so etwas habe ich gesucht. Danke. Aber leider funktioniert dann meine if-Anweisung nicht mehr, mit der ich, wenn man keine Componente anklickt die Markierung verschwindet. Hast du dafür noch ne Idee?
 
Jo, genau so etwas habe ich gesucht. Danke. Aber leider funktioniert dann meine if-Anweisung nicht mehr, mit der ich, wenn man keine Componente anklickt die Markierung verschwindet. Hast du dafür noch ne Idee?

Öhm - wieso sollte das denn nicht mehr funktionieren? Die Abfrage selber muss natürlich weiterhin path auf null prüfen. Erst innerhalb des else-Blocks ruftst du dann getLastPathComponent() auf

Java:
...
	if (path == null) {
		getTree().setSelectionRow(-1);
		getfieldPath().setText("");
	} else {
		String stringPath = path.getLastPathComponent().toString();
		getfieldPath().setText(stringPath);
	}
...
 
eine Kleinigkeit hätte ich noch. ^^
Ist es möglich das man die MouseMethode so schreiben kann das nur bestimmte Pfade angeklickt werden können? Ich weiss nicht recht wie ich das beschreiben soll, drum mache ich das an diesem Beispiel:

http://openbook.galileocomputing.de/javainsel7/bilder/jtreedemo.gif

Ich möchte das man nur "Blatt1, Blatt2 usw." anklicken kann. Wurzel und Knoten jedoch nicht. Die sollen sich nicht markieren wenn man sie anklickt.

Weiss jemand eine Möglichkeit oder eine Methode?

Bedanke mich für die gesamte vorherige Hilfe und die hoffentlich noch kommende...^^
 
Zuletzt bearbeitet:
Zurück