PopUpMenu und überdeckte Komponenten

Angiii

Erfahrenes Mitglied
Hallo Gemeinde ;-),

habe folgende Situation:

Ich habe ein JPanel, auf dem ich weitere Komponenten platziert habe, z.B. 4 JButtons. Nun will ich, dass sich auf jeder Beliebigen Position des JPanels mit Hilfe der rechten Maustaste ein PopUpMenu öffnen lässt.

Dazu habe ich an das JPanel einen Mouselistener gehängt, welche das Menü öffnet. Das Ganze funktioniert, aber an den Positionen der JButtons reagiert der Listener nicht. Irgendwie auch logisch, die Buttons überdecken ja das JPanel an diesen Stellen.

Aber muss ich jetzt wirklich für jedes Element auf den JPanel einen extra Mouslistener hinzufügen, nur um auch da mein Menü öffnen zu können?

Oder gibt es eine Art allgemeinen Mouselistener, der immer reagiert, egal wo ich ihn auslöse?

Danke!
 
Moin,

nein, das ist ja auch klar ... ein Listener gilt immer ausschließlich für das Objekt, an den er gebunden wird (hier also Panel und NICHT Button). Es macht vermutlich ja auch nicht viel Sinn, die gleichen Aktionen beim Buttonklick wie beim Klick aufs Panel ablaufen zu lassen.

Aber Du kannst natürlichen EINEN Listener schreiben und diesen jeweils an alle vier Button hängen (falls dies denn Sinn macht und gewollt ist) !

Sollen denn bei allen vier Button wirklich die gleichen Aktionen ausgeführt werden :confused:

Gruß
Klaus
 
Man kann auch einen Listener schreiben und dadrin dann ueberpruefen welcher gedrueckt wurde und dann die jeweilige Aktion ausfuehren :D
 
Moin,

Man kann auch einen Listener schreiben und dadrin dann ueberpruefen welcher gedrueckt wurde und dann die jeweilige Aktion ausfuehren :D

Schon klar, aber das macht den Code - je nachdem, was an Aktionen folgt - ggf. recht unübersichtlich!

Zudem hatte ich auch eher das Gefühl, dass hier ein pauschaler Listener (also ohne weitere Differenzierung) verwendet wird ... ok, da hätte ich mich sicher klarer ausdrücken können ... aber so ist das halt zwei Tage vor dem Urlaub:D

Gruß
Klaus
 
Also soweit ich das weis kann man in einem MouseListener überprüfen welche Maustaste gedrückt wurde. Denn sonst würde der normale MouseListener den Buttons automatisch bekommen auch bei einem rechtsklick reagieren was ja nicht der Fall ist.
Was du jetzt allerdings machen könntest wäre ein JLayeredPane zu verwenden.
Dafür musst du aber deine GUI ggf umschreiben weil du deine gesamte GUI auf ein JPanel bekommen musst und dieses dann dem JLayeredPane hinzufügen musst *am besten als UNTERSTES*. Dann erzeugst du ein zweites JPanel , hängst diesem dein MouseListener an in dem dann explizit auf Rechtsklick geprüft werden muss ... setzt dieses mit setOpaque(true) durchsichtig und fügst es als höheres Panel dem JLayeredPane zu. Dadurch wird dein Rechtsklick überall abgefangen ... und der normale Linksklick wird auf die JButtons weitergereicht *wenn meine Theorie stimmt*. Ob das wirklich so funktioniert weis ich jetzt nicht sicher, aber wenn das obere JPanel keine MouseListener hat werden die Klicks definitiv das erste darunter liegende Component weitergereicht die dann einen Listener für die entsprechenden Bounds hat.
 
Zurück