JTree - Selektieren mit Rechtsklick

Status
Nicht offen für weitere Antworten.

Evolver

Bekanntes Mitglied
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:
Code:
public void mouseClicked(MouseEvent pME)
{
   if(pME.getButton()==3) 
      mMyTree.setSelectionPath(mMyTree.getPathForLocation(pME.getX(), pME.getY()));
}
 
MouseListener an den JTree, bei mouseReleased*:
Code:
       if(evt.isPopupTrigger()){
            tree.setSelectionPath(tree.getPathForLocation(evt.getX(), evt.getY()));
EDIT: und mousePressed, siehe Folgepost.
 
@Beni: ja richtig, ich glaube die API sagt auch, daß man aus diesem Grund "isPopupTriggered" in "mouseReleased" und "mousePressed" aufrufen sollte :wink:
 
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.
 
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.
 
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)).

Code:
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()?
 
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.
 
ich wollt nur mal sagen mac's mighty mouse hat 5 maustasten und das nich erst seit gestern :roll: 😳 :wink:
 
die mighty mouse ist aber die standardmaus, eine andere bekommst du von apple gar nicht ???:L
 
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.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben