# Rechte Maustaste soll Menü aufrufen



## Guest (27. Okt 2004)

ich würd gern wenn ein Mousclick auf eine bestimmte Komponente in meiner GUI gemacht wird, ein Menü aufpoppen lassen, indem einige Funktionen vorhanden sein sollen.
Existiert sowas bereits oder muss ich mir das selbst kreieren?

vom Prinzip müsst ich ja einfach nen MouseListener adden. Der reagiert dann auf den Rechtsclick. Die Mousezeigerlocation wird ermittelt und da setz ich dann mein Fenster hin. Sobald das Fenster den Focus verliert, schliesst es sich.
Hört sich eigentlich recht umkompliziert an


----------



## 0xdeadbeef (28. Okt 2004)

Es gibt dafür bereits eine entsprechende Swing-Komponente: JPopupMenu. Das Menü wie gewohnt mit Items usw. füllen, dargestellt wird es mittels der Methode show an den Koordinaten, die das mouseClicked-Event zurückliefert.
In diesem Beispiel ist jPopupMenu die Referenz auf das Menü:


```
addMouseListener(new java.awt.event.MouseAdapter() {
    public void mouseClicked(java.awt.event.MouseEvent evt) {
        if (evt.getButton() == evt.BUTTON3)
            jPopupMenu.show(evt.getComponent(), evt.getX(), evt.getY());
    }
});
```

Da es üblicherweise pro Komponente unterschiedliche PopupMenus gibt, muß man auch entsprechend für jede Komponente einen [/code]


----------



## Guest (28. Okt 2004)

Es gibt bei MouseEvent die Methode "isPopupTrigger()".

```
public void mouseClicked(MouseEvent event) {
  if(event.isPopupTrigger()) {
    //... hier Popup anzeigen, wie im Beispiel oben
  }
}
```


----------



## Stefan1200 (28. Okt 2004)

Anonymous hat gesagt.:
			
		

> Es gibt bei MouseEvent die Methode "isPopupTrigger()".



Genau, bei dem Beispiel von 0xdeadbeef könnte es sonst passieren, das MacOS X User doof da stehen, weil viele nur eine Maustaste haben...


----------



## 0xdeadbeef (28. Okt 2004)

Ok, ok , schlagt mich 
Und überhaupt: Leute mit einer Maustaste sind selber schuld  :bae:


----------



## Stefan1200 (28. Okt 2004)

0xdeadbeef hat gesagt.:
			
		

> Ok, ok , schlagt mich
> Und überhaupt: Leute mit einer Maustaste sind selber schuld  :bae:



Ich will ja nicht widersprechen...zumal MacOS X Mäuse mit mehr als einer Taste untersützt. (Ohne zusätzliche Treiber)


----------



## Guest (28. Okt 2004)

Stefan1200 hat gesagt.:
			
		

> Ich will ja nicht widersprechen...zumal MacOS X Mäuse mit mehr als einer Taste untersützt. (Ohne zusätzliche Treiber)


Wahnsinn! Sowas gibt es bereits? Der Fortschritt ist wohl nicht aufzuhalten.


----------



## Guest (28. Okt 2004)

ok dann weiter im Kontext. Den Rechtsklick zu verwirklichen scheint ja ned schwer zu sein.
Ich würd den gern auf ne JTable anwenden. Also ich mach nen Rechtklick auf ne Row und dann soll das Popupmenu erscheinen. Das is auch ned das Problem. Doch wie bekomm ich den SelectedRowIndex jetzt?
Bzw wie kann ich festlegen, dass ich auch mit Rechtsklick ne Row selektieren kann?


----------



## Student (29. Okt 2004)

Anonymous hat gesagt.:
			
		

> wie kann ich festlegen, dass ich auch mit Rechtsklick ne Row selektieren kann?


würde ich nicht machen.

links: selektieren
rechts: popup aufrufen 

so würde ich das als user an die sache rangehen.



> Doch wie bekomm ich den SelectedRowIndex jetzt?


so?
 :arrow:  http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JTable.html#getSelectedRow()


----------



## Guest (29. Okt 2004)

das mit der Verteilung der Klickfunktionen will ich auch so beibehalten. 
Nur das Problem is ja, dass die Methode getSelectedRow() -1 zurückliefert wenn keine Row selektiert ist und genau das is ja der Punkt bei nem Rechtsklick. Die Row wird nämlich dabei nicht selektiert.

Bsp:
Ich klicke rechts auf einen JTable-Eintrag. Die Row wird selektiert und es geht ein Popupmenu auf, dass Operationen für die selektierte Row anbietet.


----------



## Student (29. Okt 2004)

Anonymous hat gesagt.:
			
		

> Nur das Problem is ja, dass die Methode getSelectedRow() -1 zurückliefert wenn keine Row selektiert ist und genau das is ja der Punkt bei nem Rechtsklick. Die Row wird nämlich dabei nicht selektiert.



ach .. jetzt verstehe ich .. mussich mal nachdenken ..


----------



## Guest (30. Okt 2004)

So ungefähr kannst Du es machen.

```
public void mouseClicked(MouseEvent event) { 
  if(event.isPopupTrigger() && selectRowAt(event.getPoint())) { 
    // Popup anzeigen
  } 
}

private boolean selectRowAt(Point point) {
  int row = table.getRowAt(point);
  if(row == -1)
    return false;
  table.setRowSelectionInterval(row, row);
  return true;
}
```


----------

