# java.awt.IllegalComponentStateException bei JPopupMenu



## tini (4. Nov 2005)

Hallo,
ich hab hier ein Problem, bei dem ich nicht weiter weiß.
Ich habe ein normales Menü, dem ich mittels ner for()-Schleife mehrere JMenuItems hinzufüge. Nun will ich diesen Items ein PopupMenu hinzufügen, das es mir ermöglicht, diese Items wieder aus dem Menü zu löschen (noch nicht implementiert).

Folgender Code:

```
final JPopupMenu deletePopup = new JPopupMenu();
            JMenuItem deleteItem = new JMenuItem("Löschen");
            deleteItem.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					//TODO
				}
            });

...
 for (int i=0; i<pFile.length; i++) {

...
                    JMenuItem menuItem = new JMenuItem(p.getProperty("profile.name", pFile[i]));
                    menuItem.setActionCommand(profileDirName+"/"+pFile[i]);
                    menuItem.addActionListener(pml);
                    menuItem.addMouseListener(new MouseListener() {
                        public void mousePressed(MouseEvent evt) {
                            if (evt.isPopupTrigger()) {
                            	deletePopup.show(evt.getComponent(), evt.getX(), evt.getY());
                            }
                        }
                        public void mouseReleased(MouseEvent evt) {
                            if (evt.isPopupTrigger()) {
                            	deletePopup.show(evt.getComponent(), evt.getX(), evt.getY());
                            }
                        }
		      public void mouseClicked(MouseEvent evt) {}
		      public void mouseEntered(MouseEvent arg0) {}
		      public void mouseExited(MouseEvent arg0) {}
                    });
}
...
```

Wenn ich das ganze nun ausprobiere bekomme ich eine java.awt.IllegalComponentStateException in der Methode MouseReleased() mit dem Hinweis "component must be showing on the screen to determine its location".
Leider kenn ich mich mit den Exceptions nicht so aus und hab auch im Internet nicht viel gefunden, was mir weiterhilft.
Deshalb würde ich mich freuen, wenn mir jemand weiter helfen könnte und mir sagt, was ich da falsch gemacht habe, und ob das überhaupt geht, was ich mir da vorgestellt habe (also einem Menü ein Popup hinzufügen - wie im InternetExplorer, wo man Bookmarks aus dem Menü per Klick auf die rechte Maustaste löschen kann). Wenn es nicht geht, ist es auch nicht schlimm. Dann überleg ich mir was anderes.

Danke schon mal im Voraus.


----------



## Ralf Ueberfuhr (4. Nov 2005)

??? Wozu möchtest du denn ein Popup von einem Menüpunkt aufrufen?

Ich denke es liegt wohl daran, dass der Menüpunkt nach dem Klicken wieder verschwindet und das Popup nun nicht daran ausgerichtet werden kann.


----------



## tini (4. Nov 2005)

Wie schon gesagt, möchte ich gerne so ne Funktionalität wie im InternetExplorer, wo man Bookmarks direkt aus dem Menü löschen kann ohne erst einen zusätzlichen Dialog aufrufen zu müssen. Dort ist das auch mit einem Popup-Menü realisiert. Also muss es ja irgendwie gehen.

Bei nem Klick mit der rechten Maustaste soll der Menüpunkt eigentlich nicht wieder verschwinden sondern das Popup aufgehen, wo ich dann sagen kann, dass dieser Eintrag gelöscht werden soll.

Also ist das irgendwie zu realisieren oder sollte ich doch auf einen Extra-Dialog (wie z.b. in Opera) zurückgreifen?


----------



## Ralf Ueberfuhr (4. Nov 2005)

Du rufst das PopupMenu 2mal auf: Wenn die Maus gedrückt wird, und wenn sie losgelassen wird.

Entferne den Code in mouseReleased(...). Das sollte funktionieren.


----------



## tini (4. Nov 2005)

Nee, also wenn, dann muss ich es aus mousePressed() rausnehmen. Hab mal mit Systemausgaben getestet und er will das Popup nur bei mouseReleased() aufrufen. Da kommt aber die Exception.

Habe auch festgestellt, dass alle anderen Menüeinträge keinen Unterschied zwischen rechter und linker Maustaste machen, d.h. es ist egal, mit welcher Taste ich draufdrücke, es wird immer die Aktion ausgeführt und das Menü schließt sich wieder.

Kann es sein, dass dieser Effekt dadurch verursacht wird, dass an den anderen MenuItems ein ActionListener und kein MouseListener dran hängt? Oder ist das eine Einstellung von JMenu?

Ich habe das mal bei Eclipse/Opera versucht, da gehen die Menüs zu, wenn ich mit der linken Maustaste klicke (was ja normal ist). Wenn ich jedoch mit der rechten klicke, bleiben sie offen. Und wenn sie offen bleiben, sollte es ja kein Problem sein, da ein PopupMenu anzuhängen, denn dann sind sie ja sichtbar, wenn ich klicke.

Ich sollte vielleicht noch sagen, dass ich das nicht selbst programmiert habe, sondern mich jetzt darin einarbeiten muss. Bin für jeden Vorschlag dankbar.


----------



## Ralf Ueberfuhr (4. Nov 2005)

mousePressed ist schon richtig, nur ersetze das e.isPopupTrigger durch SwingUtilities.isRightMouseButton(e), dann klappt es.


----------



## tini (4. Nov 2005)

Okay, also jetzt erscheint das Popup! Danke viemals!

ABER:
Das Menü geht trotzdem wieder zu. D.h. ich seh nicht mehr was ich eigentlich ausgewählt habe und mein Popup "hängt in der Luft".
Wie bring ich also das Menü dazu nicht wieder zuzuklappen, wenn ich mit rechts geklickt habe, damit ich sehe, was ich ausgewählt habe?


----------

