Workaround: TrayIcon & JPopupMenu

hdi

Top Contributor
Hey,

ich habe in meiner Applikation ein TrayIcon, welches von Haus aus eine setPopupMenu(PopupMenu) Methode anbietet. Leider ist das AWT, und in der API wird auch davon geredet dass Swing da nicht unterstützt ist. Da mir AWT aber nicht gefällt und ich unbedingt ein JPopupMenu wollte habe ich das kurzerhand so hingebogen. Ich ignoriere diese Popup-Funktionalität des TrayIcon einfach (setPopupMenu(null)) und manage selber ein JPopupMenu mit nem MouseListener auf dem TrayIcon.

Es funktioniert nun nach etwas Rumprobieren auch, das Dumme nur: Ich weiß nicht warum :D Und es ist kein gutes Gefühl Code zu haben, der zwar (scheinbar) funktioniert, ohne dass man jedoch versteht was der Code eigentlich tut ;) Ich hoffe jemand hat gerade etwas Interesse sich mit dem Code zu beschäftigen :) (Ist nicht viel)

Also: MouseListener auf meinem TrayIcon, bei mousePressed zeige ich mein JPopupMenu an. Erster Versuch sah so aus:

Java:
	@Override
	public void mousePressed(MouseEvent e) {
		popup.show(null, e.getX(), e.getY());
	}

Die show-Methode erwartet als ersten Parameter eine Component - es hat sich herausgestellt dass wenn man null übergibt (oder diese Methode ganz meidet und per setLocation & setVisible arbeitet) nicht die typische Popup-Menu Funktionalität vorhanden ist. D.h.: Wenn man mit der Maus über die MenuItems geht, ändert sich daran nix. Normalerweise werden die dann ja farblich unterlegt. Also das hat mir nicht gefallen denn das sieht irgendwo so aus als sei das Programm abgestürzt (das ist es nicht). Außerdem verschwindet das Popup nicht wenn man woanders hinklickt.

Also dachte ich mir okay ich brauche also eine Component statt dem null. Zuerst einmal einfach new JFrame() übergeben, aber das führt zu ner Exception: Die Component muss gerade visible sein.
Okay also hab ich mir nen Dummy-Dialog gebastelt:

Java:
		popupDummy = new JDialog();
		popupDummy.setSize(0, 0);
		popupDummy.setUndecorated(true);
                popupDummy.setVisible(true);

und die show() angepasst:


Java:
	@Override
	public void mousePressed(MouseEvent e) {
		popup.show(popupDummy, e.getX(), e.getY());
	}

Hurra, jetzt tut sich was beim Mouse-Over, also das passt. Aber das Problem mit dem Nicht-Verschwinden beim Klick woanders hin ist noch immer da.

Und jetzt kommt das, was ich nicht verstehe: Ich hab dann mal einfach aus Gaudi das setVisible(true) für den Dummy-Dialog mit in diese Methode reingenommen:

Java:
	@Override
	public void mousePressed(MouseEvent e) { 
                popupDummy.setVisible(true);
		popup.show(popupDummy, e.getX(), e.getY());
	}

Voila: Wenn man jetzt bei angezeigtem Popup irgendwo außerhalb des Popups klickt verschwindet es. WARUM? Ich check's nicht, ein setVisible(false) o.ä. mach ich nicht - das hier ist wirklich der gesamte Code dafür! Ich hab mal gekuckt ob ein popupDummy.requestFocus() auch ausreicht, tut's aber nicht. Also was passiert beim setVisible(true) noch, dass er komischerweise das Popup verschwinden lässt wenn man woanders hinklickt. Was hat das damit zu tun? Immerhin kommt das setVisible ja BEVOR ich die show() Methode aufrufe, die ja nach dem ersten mal sowieso nix mehr ändert weil der Dummy dann schon visible ist.

Wer mir das erklären kann dem bin ich sehr dankbar! :)

Und jetzt noch ne Kleinigkeit, wer ne Idee hat: Wie bekomm ich ein "AlwaysOnTop"-Verhalten auf mein JPopupMenu?

lg
 

Wildcard

Top Contributor
Es geht doch nur um ein Popup nicht um aufwendigen GUI Code, also warum nicht einfach AWT benutzen wie es in der API vorgesehen ist?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Was haltet Ihr von diesem workaround? AWT, Swing, JavaFX & SWT 3
R Problem mit TrayIcon unter Windows/Linux AWT, Swing, JavaFX & SWT 7
S Swing TrayIcon bei Systemdienst (Windows, Systemuser) AWT, Swing, JavaFX & SWT 7
W AWT Listener bei TrayIcon AWT, Swing, JavaFX & SWT 2
G TrayIcon.displayMessage tonlos aufpoppen AWT, Swing, JavaFX & SWT 4
W TrayIcon mit jdic (Problem bei .jar Datei) AWT, Swing, JavaFX & SWT 3
W TrayIcon in Windows 7 unscharf AWT, Swing, JavaFX & SWT 8
DStrohma Bild für TrayIcon skalieren AWT, Swing, JavaFX & SWT 13
D TrayIcon AWT, Swing, JavaFX & SWT 3
D Trayicon AWT, Swing, JavaFX & SWT 11
T AWT AWT TrayIcon in Ubuntu AWT, Swing, JavaFX & SWT 19
I TrayIcon aber bitte nur einmal AWT, Swing, JavaFX & SWT 2
B trayicon will nit AWT, Swing, JavaFX & SWT 7
L Wie adde ich ein JPopUpMenu AWT, Swing, JavaFX & SWT 3
Nabbit Über JList kein JPopupMenu AWT, Swing, JavaFX & SWT 2
P Event Handling Listener beim öffnen von einem JPopupMenu AWT, Swing, JavaFX & SWT 3
M Accelerator zu JMenuItem des JPopupMenu einer JList AWT, Swing, JavaFX & SWT 2
M JPopupMenu per Klick schließen und gleichzeitig ActionEvent auf JButton? AWT, Swing, JavaFX & SWT 15
S Swing JPopupMenu visible AWT, Swing, JavaFX & SWT 4
S JPopupMenu schließen in SystemTray AWT, Swing, JavaFX & SWT 2
xehpuk Swing Listener für JPopupMenu AWT, Swing, JavaFX & SWT 3
K Swing Listener bei JPopupMenu AWT, Swing, JavaFX & SWT 9
S JPopupMenu oder JCombobox die JList oeffnet..? AWT, Swing, JavaFX & SWT 7
A Swing in JPopupMenu die JRadioButtonMenuItems durchlaufen AWT, Swing, JavaFX & SWT 3
T JmenuItems in JPopupMenu kontextabhängig deaktivieren AWT, Swing, JavaFX & SWT 2
S Swing JPopupMenu nicht schließen AWT, Swing, JavaFX & SWT 2
pinerski Probleme mit JPopupMenu und JMenuItem AWT, Swing, JavaFX & SWT 7
hdi Swing JPopupMenu: Größe AWT, Swing, JavaFX & SWT 4
B JPopupMenu, getParent Problem... AWT, Swing, JavaFX & SWT 2
Dragonfire width of JPopupMenu StyleBug AWT, Swing, JavaFX & SWT 3
M JPopupMenu - Ein vorhandenes Kontextmenü erweitern AWT, Swing, JavaFX & SWT 6
Iron Monkey JPopupMenu/JMenuItem Index für getSubElements()[] ermitteln AWT, Swing, JavaFX & SWT 8
X JPopupMenu Items aktualisieren sich nicht AWT, Swing, JavaFX & SWT 3
T JPopupMenu "schließen" AWT, Swing, JavaFX & SWT 7
M jPopupMenu AWT, Swing, JavaFX & SWT 2
M jPopupMenu - Problem bei der Positionierung AWT, Swing, JavaFX & SWT 3
N JPopupMenu - ausgewähltes Element zurückgeben AWT, Swing, JavaFX & SWT 2
P JPopupMenu scrollen AWT, Swing, JavaFX & SWT 2
A JPopupMenu: Nach oben aufpoppen AWT, Swing, JavaFX & SWT 9
S Problem mit JPopupMenu AWT, Swing, JavaFX & SWT 3
T JPopupMenu wird bei Rechtsklick angezeigt! AWT, Swing, JavaFX & SWT 3
Firefork JPopupMenu unter einem Schalter darstellen AWT, Swing, JavaFX & SWT 2
K Netbeans GUI Builder (Matisse) und erstellen von JPopupMenu AWT, Swing, JavaFX & SWT 1
I In JPopupMenu scrollen AWT, Swing, JavaFX & SWT 4
M JPopupMenu per linker Maustaste öffnen AWT, Swing, JavaFX & SWT 9
V Beliebige Komponenten in einem JPopupMenu? AWT, Swing, JavaFX & SWT 3
F Problem mit JPopupMenu AWT, Swing, JavaFX & SWT 3
C JPopUpMenu in einem JTree ist lahm AWT, Swing, JavaFX & SWT 14
V JPopupMenu Problem und Tipp zu mouse/key AWT, Swing, JavaFX & SWT 3
F JPopupMenu und AbstractAction AWT, Swing, JavaFX & SWT 2
N Problem mit JPopupMenu und alwaysOnTop AWT, Swing, JavaFX & SWT 4
G Schließen von JPopupMenu AWT, Swing, JavaFX & SWT 14
G Problem mit JPopupMenu AWT, Swing, JavaFX & SWT 30
R Hässlicher Punkt bei JPopupMenu AWT, Swing, JavaFX & SWT 12
S JPopupMenu - Kontrolliert beenden AWT, Swing, JavaFX & SWT 3
C Problem mit JPopupMenu AWT, Swing, JavaFX & SWT 6
T java.awt.IllegalComponentStateException bei JPopupMenu AWT, Swing, JavaFX & SWT 6
G Problem mit JPopupMenu und Menüauswahl AWT, Swing, JavaFX & SWT 4
R JPopupMenu,JScrollPane + repaint AWT, Swing, JavaFX & SWT 8
D Probleme bei der Positionierung von JPopupMenu AWT, Swing, JavaFX & SWT 2
J "Problem" mit JPopupMenu AWT, Swing, JavaFX & SWT 7
G JPopupMenu in JTable AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen


Oben