# MouseClicked -> Rechtsklick



## Zentrum (13. Jul 2010)

Guten Nachmittag,

also ich weis 1000% wurde das schonmal besprochen aber ich finde dazu nichts, wie kann ich bei einem MouseClicked überprüfen ob es ein Rechtsklick war, den nur dann will ich das sich ein PopUp Menu öffnet. +

Jetzt nicht sagen mach einfach 


```
if(evt.getClickCount()==2){
        	RECHTSKLICK!
        }
```

sonder wie man das wirklich unterscheide. Will eben das nur wenn ein bestimmter EIntrag in der JList selected ist ... und wenn dann ein Rechtsklick erfolgt das sich dann ein PopUp Menu öffnet.

Danke für die Hilfe, suche bestimmt schon seit 12Uhr

Grüße Zentrum


----------



## Gast2 (13. Jul 2010)

dann hast du aber nicht wirklich sorfältig gesucht, ein Blick in die API hätte gereicht  :

```
evt.getButton()
```
gibt dir den Button zurück mit dem geklickt wurde (MouseEvent.BUTTON2 wäre die rechte Maustaste).
Alternativ kannst du für Popups auch 
	
	
	
	





```
evt.isPopupTrigger()
```
 nutzen


----------



## Marcinek (13. Jul 2010)

In MouseEvent gibt es Konstanten, die Maustasten andeuten.

Ich glaube, dass 

 public static final int BUTTON1 = 1;

linke Taste und 

  public static final int BUTTON2 = 2;

rechte Maustaste ist.


----------



## Michael... (13. Jul 2010)

Die Klasse MouseEvent kennt die Methode 
	
	
	
	





```
isPopupTricker()
```
damit definiert das System welche Maustaste Popups aktiviert

Daneben gibt's seit Java 1.5 die Methode 
	
	
	
	





```
setComponentPopupMenu(JPopupMenu popup)
```
 mit der man einer Komponente direkt ein Popup zuweisen kann.


----------



## Zentrum (14. Jul 2010)

Kann mir jemand eine gute Seite empfehlen wo man sich in JPopUp Menu einlesen kann?!

Den ich muss hier eben noch die Position angeben können. Habe ja eine JList mit X Einträgen und erst wenn ein Eintrag selected worden ist, soll genau dort eben bei einem Rechtsklick ein PopUp Menu geöffnet werden. 


```
private void jList1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jList1MouseClicked
    	JPopupMenu popup = new JPopupMenu();
    	if(evt.getButton() == MouseEvent.BUTTON3){
    		
    	}
```


also jetzt geht es mir wie kann ich dem PopUp menu sagen öffne dich eben an dieser und dieser stelle und nicht überall?!


----------



## Michael... (14. Jul 2010)

Zentrum hat gesagt.:


> Kann mir jemand eine gute Seite empfehlen wo man sich in JPopUp Menu einlesen kann?!
> Den ich muss hier eben noch die Position angeben können.


Ganz hilfreich ist oft: die API Doku zu lesen: JPopupMenu
Da wird dann z.B. die Methode setLocation(int x, int y) aufgeführt.
Dann gibt's noch Sun Tutorials : How to Use Menus


Zentrum hat gesagt.:


> Habe ja eine JList mit X Einträgen und erst wenn ein Eintrag selected worden ist, soll genau dort eben bei einem Rechtsklick ein PopUp Menu geöffnet werden.


Das hat ja dann auch etwas mit der Liste zu tun, einfach überprüfen, ob in der JList ein Eintrag selektiert ist: siehe Doku zu JList dann kannst Du ja entscheiden, ob das Popup auftauchen soll oder nicht.
Ausserdem verrät Dir auch das MouseEvent über entsprechende Methoden die Position an der geclickt wurde.


----------



## zentrum (14. Jul 2010)

also zum herrausfinden wo geclickt wurde kann ich, aber was bringt mir das es soll eben nur ein PopUp geöffnet werden wenn genau auf einen Eintrag in der JList ein rechtsklick ausgeführt wurde. WEnn er ins leere ein Rechtsklick macht soll nichts passieren. 

mhh.... wie gehe ich den mit dne Daten um?!


----------



## Marcinek (14. Jul 2010)

Hallo,

ich würde mal mehr über dieses in erfahrung bringen:


```
setComponentPopupMenu(JPopupMenu popup)
```

In JList ist es "schwierig", aber nicht unmöglich auf die einzelenen Zellen ein Popup zu machen. Problem ist, dass über den zellen eine "Glasspane" sitzt und du nicht die korrekte Zelle auswählen kannst.

Ich löse das sehr aufwendig über das dahinterliegende Modell.

Ich würde erstmal testen, dass ich das POPUP an der richtigen stelle öffne, wenn das geht dann das popup zu dem richtigen Datzensatz.

Gruß,

Marcinek


----------



## Michael... (14. Jul 2010)

Schau doch mal in die API Doku. JList bietet eine Methode *locationToIndex(Point location)* damit kann man erfragen, ob und überwelchem Eintrag der der Mouseclick ausgeführt wurde, dann kann man (im Falle eines Rechtsclick) diesen aktiv selektieren oder überprüfen, ob er selektiert ist und dem entsprechend ein Popup aufpoppen lassen oder nicht.


----------



## zentrum (14. Jul 2010)

also ich habe eine Testanwendung, und dort ist dies so geregelt das wenn auf in die Liste rechtsgeklickt wird und dort kein Eintrag enthalten ist macht er nichts, wenn aber auf ein Eintrag rechts geklickt wurde, wird dieser selektiert und es erscheint ein PopUp Menu. 

Mit den Point usw. das ist schon schön aber ich will eben nicht das er mir den nächst liegenden Eintrag nimmt sondern nur wenn eben auf diesen geklickt wird

Ich finde in der API nichts für mein Lösungsweg


----------



## zentrum (14. Jul 2010)

kann man irgendwie den Point auslesen wo der Eintrag der JList steht ?!.... 

Oder wo der selected Werd der JList ist?


----------



## zentrum (14. Jul 2010)

also habe es aufwendig hinbekommen

Danke erstmal für alle hilfe sonst hätte ich esnicht hinbekommen...


```
JPopupMenu popup = new JPopupMenu();
    	createPopup(popup);
    	int index = jList1.locationToIndex(evt.getPoint());
        jList1.setSelectedIndex(index);
        if(evt.getButton() == MouseEvent.BUTTON3){
    		if(evt.getY() >= index*17+index && evt.getY() <= index*17+index+17 ){
    			popup.show(jList1, evt.getX(), evt.getY());
    		}
    	}
```

werde anstatt der 17 eben noch die größe des Eintrages auslesen!


----------



## Michael... (14. Jul 2010)

Versteh jetzt nicht, was an ein paar Zeilen Code so aufwendig ist
Vermutlich die richtigen hinzuschreiben ;-)

Dein Problem bestand herauszufinden ob tatsächlich über dem letzen Eintrag geclickt wurde?

Hier ein spontaner Ansatz von mir, ohne berechnen der Zellenposition:

```
list.addMouseListener(new MouseAdapter() {
		public void mouseClicked(MouseEvent e) {
			if (e.getButton() == MouseEvent.BUTTON3) {
				int index  = list.locationToIndex(e.getPoint());
				Rectangle rect = list.getCellBounds(index, index);
				int y = e.getY();
				if (y >= rect.y && y <=(rect.y + rect.height))
					System.out.println("Rechtsklick über Listenindex: " + index);
				else
					System.out.println("Rechtsklick würde über keinem Eintrag ausgeführt.");
			}
		}
	});
```


----------



## zentrum (14. Jul 2010)

ehm bin grad in der Ausbildung und erste mal mich mit JPopUp befasst, also fand ich es schon schwer.


----------



## Michael... (14. Jul 2010)

zentrum hat gesagt.:


> ehm bin grad in der Ausbildung und erste mal mich mit JPopUp befasst, also fand ich es schon schwer.


Will ja nicht abstreiten, dass es am Anfang nicht immer ganz einfach ist. ;-) Aber gerade als Anfänger sollte man sich an das Arbeiten mit der API Doku gewöhnen, dann da findet sich die Lösung zu vielen Fragen und Problemen - ist jetzt meine persönliche Erfahrung.


----------



## KrokoDiehl (14. Jul 2010)

<klugscheiss>
Also ich habe mal gesehen/gehört/mitbekommen das man _SwingUtilities _zur Button-Prüfung nutzen sollte...

```
public void mouseClicked(MouseEvent event)
{
    if (SwingUtilities.isRightMouseButton(event))
    {
    } //if Rechtsklick    
}
```
</klugscheiss>

Auch wenn es nicht unbedingt Kern dieses Themas ist, wollte ich das mal loswerden


----------

