# JTree - Selektieren mit Rechtsklick



## Evolver (15. Sep 2007)

Ich habe mich etwas mit JTrees befasst. In meinem Fall kann ich mit Rechtsklick ein Kontextmenü (JPopupMenu) öffnen um irgendwelche Aktionen auf die Datenelemente des Baum durchzuführen. Unter Windows ist es ja Standard (und auch praktisch), dass bei einem Rechtklick auch das darunterliegende Element (Knoten) selektiert wird. Der JTree aber markiert Elemente ja nur bei einem Linksklick.

Gibt es eine einfache Möglichkeit, auch mittels Rechtsklick zu Selektieren? Oder wäre die einizige Möglichkeit, ein MouseListener auf dem JTree, der umständlich ermitteln muss, ob und welches Element unter der "Klickposition" liegt und es ggf. selektieren?


=============== EDIT ===============

Naja, nach etwas intensiverer Suche habe ich jetzt festgestellt, dass es doch ganz einfach ist. Im MouseListener muss ich einfach nur folgenden Code bei Rechtsklick ausführen:
	
	
	
	





```
public void mouseClicked(MouseEvent pME)
{
   if(pME.getButton()==3) 
      mMyTree.setSelectionPath(mMyTree.getPathForLocation(pME.getX(), pME.getY()));
}
```


----------



## André Uhres (15. Sep 2007)

MouseListener an den JTree, bei mouseReleased*:

```
if(evt.isPopupTrigger()){
            tree.setSelectionPath(tree.getPathForLocation(evt.getX(), evt.getY()));
```
EDIT: und mousePressed, siehe Folgepost.


----------



## Beni (15. Sep 2007)

André Uhres hat gesagt.:
			
		

> ... bei mouseReleased:



:!: Bei einigen Systemen (Linux) ist "isPopupTriggered" nur bei einem "mousePressed" true  :!:


----------



## André Uhres (15. Sep 2007)

@Beni: ja richtig, ich glaube die API sagt auch, daß man aus diesem Grund "isPopupTriggered" in "mouseReleased" *und* "mousePressed" aufrufen sollte :wink:


----------



## Evolver (15. Sep 2007)

Was genau es mit der isPopupTrigger() auf sich hat, habe ich noch nicht genau verstanden... 





> public boolean isPopupTrigger()
> Liefert true, falls es sich um das Ereignis handelt, mit dem Popup-Menüs geöffnet werden, sonst false.



...aber da ich mein JPopupMenu vom selben MouseListener (und der selben Funktion) aus aufrufe, funktioniert es einwandfrei, den _SelectionPath_ einfach dort zu setzen.


----------



## André Uhres (15. Sep 2007)

Evolver hat gesagt.:
			
		

> Was genau es mit der isPopupTrigger() auf sich hat, habe ich noch nicht genau verstanden..


isPopupTrigger garantiert Plattformunabhängigkeit, weil der PopupTrigger nicht bei allen Plattformen der Rechtsklick sein muss.


----------



## Wildcard (15. Sep 2007)

André Uhres hat gesagt.:
			
		

> weil der PopupTrigger nicht bei allen Plattformen der Rechtsklick sein muss.


Ein Mac zum Beispiel hat nämlich gar keine rechte Taste...


----------



## Evolver (16. Sep 2007)

Also ich bin verunsichert über meine Wissenslücke bzgl. isPopupTrigger(). Also ich mache es so, dass bei Rechtklick in meinem Baum mein Object vom Typ JPopupMenu (bzw. einer davon abgeleiteten Klasse) aufgerufen wird (setVisible(true)).


```
mMyTree.addMouseListener(new MouseAdapter()
				{
					@Override
					public void mouseClicked(MouseEvent pME) {
						if(pME.getButton()==3) {
							mMyTree.setSelectionPath(mMyTree.getPathForLocation(pME.getX(), pME.getY()));
							mMyMenu.setLocation(pME.getXOnScreen(), pME.getYOnScreen());
							mMyMenu.showMenu();   // in dieser Methode wird dann setVisible(true) aufgerufen
						}
					}
				});
```

Ist das nicht die übliche Vorgehensweise, ein PopupMenü zu öffnen? Falls nein, wie dann? Falls ja, wo brauche ich isPopupTrigger()?


----------



## Wildcard (16. Sep 2007)

Siehe oben:
Ein Mac zum Beispiel hat i.d.R. eine Maus mit nur einer Taste. Den Mousebutton 3 wirst du also schlecht drücken können  :wink: 
Wie sich ein Popup-Menü öffnen lässt, bestimmt das Look and Feel. Der Entwickler sollte also sowohl in mousePressed als auch in mouseReleased mit isPopupTrigger abfragen, ob die durchgeführte Aktion (im gegenwärtigen L'n'F) ein Popup auslösen soll.


----------



## Roar (16. Sep 2007)

ich wollt nur mal sagen mac's mighty mouse hat 5 maustasten und das nich erst seit gestern  :roll:    :wink:


----------



## Wildcard (16. Sep 2007)

Schon klar das es auch andere gibt, aber AFAIK hat die Standard Maus immer noch eine Taste.


----------



## Roar (16. Sep 2007)

die mighty mouse ist aber die standardmaus, eine andere bekommst du von apple gar nicht  ???:L


----------



## Wildcard (16. Sep 2007)

Ok, hab's gerade gelesen. Seit Ende 2005 sind Mehrtasten Mäuse Standard bei Apple  :lol:


----------



## Evolver (16. Sep 2007)

Wildcard hat gesagt.:
			
		

> Siehe oben:
> Ein Mac zum Beispiel hat i.d.R. eine Maus mit nur einer Taste. Den Mousebutton 3 wirst du also schlecht drücken können  :wink:
> Wie sich ein Popup-Menü öffnen lässt, bestimmt das Look and Feel. Der Entwickler sollte also sowohl in mousePressed als auch in mouseReleased mit isPopupTrigger abfragen, ob die durchgeführte Aktion (im gegenwärtigen L'n'F) ein Popup auslösen soll.



OK, aber im Falle eine 1-Tasten-Maus beim Mac ist ja der PopUp-Event dann kein MouseEvent, sondern ein KeyEvent, also müsste ich auch noch einen KeyListener einfügen, oder? Für KeyEvents ist aber die Funktion isPopupTrigger() nicht definiert. 
Selbiges bei Windows: Rechts neben der Win-Taste ist ja auch eine Taste zum Öffnen eines Kontextmenüs. Die müsste ja für PopupTrigger ebenfalls true liefern, aber das ist ja auch ein KeyEvent.


----------



## Wildcard (16. Sep 2007)

Nein, kein keyEvent. Bei Mac soweit ich weiß längeres drücken des Mousebuttons und Ctrl+mouseclick.


----------



## Evolver (16. Sep 2007)

Also an der Uni musste ich ein paar mal mit einem Mac arbeiten, und soweit ich mich erinnern kann hat man da Kontextmenüs mit der Apfeltaste (http://sfk-online.com/support/images/edv/MacTastatur.gif) oder der mit dem anderen komischen Symbol neben der Leertaste (http://www.mac-and-win.de/Mac/Betriebssystem/jpg/tastatur.jpg) geöffnet.

Bliebe noch unter Windows die Taste fürs Kontextmenü.


----------

