# JTree soll nur auf Mausklick reagieren



## Gloem (23. Mrz 2007)

Hallo,


ich habe in meinem Programm einen JTree verwendet der mir die Verzeichnisstruktur anzeigt. 

Ich möchte nun per Mausklick mit der rechten Taste ein Kontextmenu aufpoppen lassen, aber allerdings nur bei den sich im Baum befindenden Bildern. 
Kann man per MouesListener sich den aktuellen Pfad zum Knoten anzeigen lassen? Oder sollte man es irgendwie über den TreeSelectionListener machen? Wie würde man dann die rechte Maustaste bekommen?


Gloem


----------



## m@nu (23. Mrz 2007)

ganz einfach... in deinem mouslistener:


```
public void mouseReleased(MouseEvent me) {
            TreePath selectedPath = null;
            if(me.isPopupTrigger()) {
                TreePath clickedPath = tree.getPathForLocation(me.getX(), me.getY());
                if(clickedPath != null) {
                    tree.setSelectionPath(clickedPath);
                    selectedPath = clickedPath;
                }

                //...
            }
```

der code wählt dir den nächstliegenden node zur klick-position aus.
per selectedPath.getLastPathComponent() erhälst du schliesslich den entsprechenden node.
dann kannst du entscheiden, ob du ein popupmenü anzeigen willst, oder nicht.


----------



## Gloem (23. Mrz 2007)

Cool, danke. Werde es mal ausprobieren. Danke für die schnelle Antwort


----------



## m@nu (23. Mrz 2007)

hm, eigentlich müsste da der selectedPath noch mit tree.getSelectedPath() initialisiert werden...
hab das snippet aus meinem eigenen code... da sind noch mehr funktionalitäten eingebaut


----------



## Gloem (23. Mrz 2007)

Hat aber auch ohne hingehauen. Die Zeile war eh unwichtig. 

Interessanten war, dass diese Zeile rausmusste. Ich weiß noch nicht genau was die bewirkt, aber mit gehts nicht


```
if(me.isPopupTrigger()) {
```


Meins sieht momentan noch so aus:

```
public void mouseClicked(MouseEvent e) {
			switch (e.getButton()) {
			case 3:
				TreePath clickedPath = t_tree.getPathForLocation(e.getX(), e.getY());
				if (clickedPath != null) {
					t_tree.setSelectionPath(clickedPath);
					final DefaultMutableTreeNode node = getTreeNode(clickedPath);
					// Bestimmen des FolderNodes der in dem Knoten gespeichert ist
					final ImageNode inode = getImageNode(node);
					if (inode != null) {
						mi_but1.setEnabled(inode.isGeoImage());
						mi_bu2.setEnabled(inode.isGeoImage());
						pm_popupmenu.show(e.getComponent(), e.getX(), e.getY());
					}
				}
				break;
			}
		}
```


----------



## m@nu (23. Mrz 2007)

stimmt schon... die selectedPath war bei mir wegen den weiteren sachen nötig, die ich weiter unten im code noch mache... von dem her 

isPopupTrigger() sagt darüber aus, ob der PopupTrigger (windows: rechtemaustaste, mac: [ctrl]+[click] (unterdessen gibts da ja aber auch ne rechte maustaste) ) geklickt wurde.
hier wird also cross-platform-compatibily gewährleistet. nicht auf jeder plattform ist immer der gleiche "maus-code" der auslöser für popupmenüs.

warum das bei dir aber nicht geht, weis ich jetzt auch nicht direkt :-/


----------



## Gloem (23. Mrz 2007)

Welche Taste wäre das denn bei WindowsXP und einer 2 Tasten Microsoft Whellmaus?

Ich bekomm für alle false zurück auch mit Kombinationen mit strg, alt oder shift


----------



## m@nu (23. Mrz 2007)

kleines testprogramm:


```
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;

/*
 * Created on 23.03.2007
 */

/**
 * @author Manuel Alabor
 * @version 1.0
 */
public class Mouse extends JFrame {

    public Mouse() {
        super("Mouse");
        
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseReleased(MouseEvent e) {
                System.out.println("Button: " + e.getButton() + "; PopupTrigger: " + e.isPopupTrigger());
            }            
        });
        
        setSize(50,50);
        setLocation(100,100);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        new Mouse().setVisible(true);
    }

}
```

also bei mir erhalte ich bei einer normalen wheelmaus mit drei tasten (linke, mausraad, rechte) folgenden output im sysout:



> Button: 1; PopupTrigger: false
> Button: 2; PopupTrigger: false
> Button: 3; PopupTrigger: true


----------



## Gloem (23. Mrz 2007)

Mhmm, in dem Testprogramm funktioniert das bei mir auch, nicht aber in meinem anderen Programm


----------



## m@nu (23. Mrz 2007)

aha! alles klar! jetzt hab ichs gesehen.

im mouseClicked() funktiniert das nie. musst das mouseReleased() ereignis auswerten, dann gehts


----------



## Gloem (23. Mrz 2007)

Aha, besten Danke


----------

