# JTable, Popup Fester per Rechtsklick auf Zelle



## Terry123 (7. Dez 2010)

Hallo,
die Überschrift sagt eigentlich schon alles 

Ich hab eine Tabelle und möchte gerne, dass bei Rechtsklick auf eine beliebige Zelle in einer bestimmten Reihe ein kleines Popup-Fenster erscheint. In diesem Fenster will ich dann eine Auswahl an Strings stehen haben, die ich dann per Knopfdruck in die Zelle schreiben kann. Der Inhalt des Popup-Fensters soll je nach Zelle unterschiedlich sein.

Leider sind meine Swing-Kenntnisse etwas begrenzt. Wie muss ich an die Sache rangehen?

Danke euch!


----------



## mjdv (7. Dez 2010)

Kann man in ne JTable nicht sogar ComboBoxen einfügen?


----------



## Terry123 (7. Dez 2010)

ja, das geht. aber das hilft mir nicht weiter. ich brauch eine Auswahl an Strings, die ich dann per Checkbox auswählen will und dann in die Zelle (TextArea) schreiben will.


----------



## Michael... (7. Dez 2010)

Man kann einen MouseListener an der JTable registieren.
Bei Rechtsklick kann mit den Methoden columnAtPoint(Point p) und rowAtPoint(Point p) ermitteln über welcher Zelle der Rechtsklick gemacht wurde und ein entsprechendes JPopupMenu anzeigen lassen.


----------



## Terry123 (8. Dez 2010)

Vielen Dank! Deine Tipps sind echt hilfreich.

Jetzt hab ich aber ein neues Problem 

Wie bekomm ich einen Rechtklick bei nem MouseListener hin? Hab im Internet leider nicht viel dazu gefunden.

Danke!


----------



## ymene (8. Dez 2010)

Soweit ich mich erinnere kannst du das MouseEvent fragen, welcher Button geklickt wurde via getButton(). Button3 entspricht der rechten Maustaste mein ich.


----------



## Terry123 (8. Dez 2010)

ok, danke dir.

Da wäre noch was 
Ich hab jetzt das Menu erstellt aber es wird nicht angezeigt. Ich hab nun gesehen dass es Befehle gibt wie "setVisible" und "show".
Ausserdem hab ich folgende Befehle gefunden, und weiss nun nicht wie man richtig vorgeht.

firePopupMenuCanceled()
firePopupMenuWillBecomeInvisible()
firePopupMenuWillBecomeVisible()

Bin etwas verwirrt. Was genau macht man denn mit den fire-Befehlen? Wozu gibt es die?
JPopupMenu (Java 2 Platform SE v1.4.2)
Ich kann mit den Beschreibungen "Notifies PopupMenuListeners that this popup menu..." nicht viel anfangen. ;( 

Danke nochmals für eure Hilfe!


----------



## Michael... (8. Dez 2010)

Diese Methoden sind für Dein Vorhaben irrelevant.
Hier mal ein kurzes Tutorial.Bringing Up a Popup Menu
Zum Anzeigen des Popups wird hier die Methode show(Component, int, int) verwendet, wobei in Deinem Fall die Komponente Deine JTable und x und y die Koordinaten des MouseEvents sind.


----------



## Terry123 (8. Dez 2010)

Ah, "show" ist also der Befehl den ich brauche. Danke.

Jetzt ist mir leider unklar was ich bei

show(Component invoker, int x, int y)

als "Component invoker" eingebe.
Muss da der Table stehen, oder die Zelle? Ist x und y die Position in Pixel innerhalb der Komponente?
Entschuldigt meine Unwissenheit ;(


----------



## ymene (8. Dez 2010)

Steht ja eigentlich schon in der Antwort und dem Link, den Michael dir zur Verfügung gestellt hat.



> Display the popup menu at the specified x,y position (specified in that order by the integer arguments) in the coordinate system of the specified component.




Sprich, du übergibst die X und Y Koordinaten ausgehend von der übergebenden Komponente, auf der das PopUpMenü dargestellt werden soll. Wenn ich mich nicht ganz irre, kannst du dort aber auch die Tabellenzelle, anstelle der Table selbst als Ausgangskomponente übergeben, sofern du das PopUp dort platzieren möchtest. Das vereinfacht natürlich die Positionsbestimmung. Und ja, die Angabe ist in Pixel ausgehend von Nordwest der jeweiligen Komponente.


----------



## Terry123 (8. Dez 2010)

ok, aber wie übergibt man eine zelle?


----------



## Michael... (8. Dez 2010)

Terry123 hat gesagt.:


> Jetzt ist mir leider unklar was ich bei
> show(Component invoker, int x, int y)
> als "Component invoker" eingebe.


siehe meinen letzten Post


Michael... hat gesagt.:


> wobei in Deinem Fall die Komponente Deine JTable und x und y die Koordinaten des MouseEvents sind.





Terry123 hat gesagt.:


> Muss da der Table stehen, oder die Zelle?


Eine Tabellenzelle ist keine Komponente, sie ist nur ein Bild, das von der JTable gemalt wird.


Terry123 hat gesagt.:


> Entschuldigt meine Unwissenheit ;(


Unwissenheit ist nicht zu entschuldigen. Die kann man durch Fragen aber auch durch Lesen bekämpfen ;-)


----------



## Terry123 (8. Dez 2010)

funktioniert. danke 

bin aber schon wieder auf was gestossen was ich nicht ganz verstehe ;(

Es gibt ja diese 3 Möglichkeiten um ein PopupMenu zu füllen:

 JMenuItem 	add(Action a)
          Appends a new menu item to the end of the menu which dispatches the specified Action object.

 JMenuItem 	add(JMenuItem menuItem)
          Appends the specified menu item to the end of this menu.

JMenuItem 	add(String s)
Creates a new menu item with the specified text and appends it to the end of this menu.

Ich möchte im Prinzip auf alle MenuItems den gleichen Befehl legen, und zwar den String des MenuItems nehmen und in die Zelle schreiben. Bisher hab ich die MenuItems mit der 3. Variante dem PopupMenu hinzugefügt, weiss nun aber nicht wie ich einen Befehl auf die MenuItems bekomme. Muss ich eventuell Variante 1 oder 2 nehmen?


----------



## ymene (8. Dez 2010)

> Eine Tabellenzelle ist keine Komponente, sie ist nur ein Bild, das von der JTable gemalt wird.




Ja, dass stimmt natürlich, hab da was durcheinander geworfen. Worauf ich hinaus wollte ist, dass man die Tabelle nach der Größe und Position der gezeichneten Tabellenzelle befragen kann via:


```
table.getCellRect(int row, int column, boolean includeSpacing)
```

Anhand diesen Rechtecks kann man dann gut die Position auf der Tabelle ausrechnen. Das ist zum Beispiel praktisch, wenn man das PopUpMenü an einer bestimmten Stelle platzieren möchte, wie beispielsweise direkt neben der Tabellenzelle. Row und Column der Tabelle können einfach über die Koordinaten des Mouseevents via:


```
table.rowAtPoint( Point )
table.columnAtPoint(Point)
```

erfragt werden.


----------



## mjdv (8. Dez 2010)

Terry123 hat gesagt.:


> funktioniert. danke
> 
> bin aber schon wieder auf was gestossen was ich nicht ganz verstehe ;(
> 
> ...



ActionListener!


----------



## Terry123 (8. Dez 2010)

Mein Probem ist, dass ich nicht weiss an was ich den Actionlistener hinhängen soll. ;(

Ich hab bisher einfach mit popupmenu.add("String") MenuItems hinzugefügt. Aber die haben doch keinen Namen den ich verwenden kann.

EDIT:
Mir fällt grad auf, ich könnte doch folgendes machen, oder?

JMenuItem mi = popupmenu.add("String");

nochmal EDIT:
Oder geht auch das hier?

popupmenu.add("String").addActionListener(new ActionListener() {


----------



## mjdv (8. Dez 2010)

Ja, so geht da auch, du solltest aber nicht den ActionListener immer mit new erstellen, sondern immer den selben nehmen.


----------



## Terry123 (9. Dez 2010)

ich mach eigentlich bei allen buttons usw. immer "new ActionListener"

wieso sollte ich das "new" weglassen?


----------



## mjdv (9. Dez 2010)

Weil du so einen neuen amchst, du aber immer den gleichen nutzen möchtest?

Kennst du dich eig. mit den Grundlagen aus ?


----------



## Sunchezz (10. Dez 2010)

```
ActionListener myListener = new ActionListener() {
  .....
};

popupmenu.add("String").addActionListener(myListener);
....
popupmenu.add("otherString").addActionListener(myListener);
```


----------

