Probleme mit JPopupMenu und Focus bzw. FocusListener

Andyx1975

Mitglied
Hallo,

ich habe ein Problem mit JPopupMenu und dem Focus listener. Der FocusListener funktioniert. Das PopUp lässt sich nicht schließen, wenn der Benutzer außerhalb des PopUps mit der Maus klickt. Mir ist aufgefallen, dass der Focus nicht auf das PopUp gesetzt wird. Ein "requestFocus()", "requestDefaultFocus()", "requestFocus(true)" oder "requestFocusInWindow()" helfen auch nicht weiter.

Ich suche jetzt nach einer Möglichkeit dass das Fenster sich schließt, wenn der Benutzer in einen anderen Bildschirmbereich klickt. Kann jemand weiterhelfen?

Code:
                final JPopupMenu popup = new JPopupMenu();

                JMenuItem mniDel = new JMenuItem("Löschen");
                JMenuItem mniClose = new JMenuItem("Schließen");
		
                popup.add(mniDel);
		popup.add(mniClose);
		
		popup.setLocation(e.getX(), e.getY());
		popup.setInvoker(popup);
                popup.setVisible(true);
                popup.setFocusable(true);
                popup.requestFocus();

                popup.addFocusListener(new FocusListener() {
			
			@Override
			public void focusLost(FocusEvent e) {
				System.out.println("lost"); //$NON-NLS-1$
				
			}
			
			@Override
			public void focusGained(FocusEvent e) {
				System.out.println("gained"); //$NON-NLS-1$
				
			}
		});
 
ok...ich habe mittlerweile die Lösung gefunden. Hierbei scheint es sich um einen Bug in Java zu handeln. Ich habe einen JDialog ohne Rahmen um das JPopUpMenu gelegt....mit diesem Workaround funktioniert es wie gewollt:


Java:
final JDialog invoker = new JDialog();
final JPopupMenu popup = new JPopupMenu();
 
JMenuItem mniDel = new JMenuItem("Löschen");
JMenuItem mniClose = new JMenuItem("Schließen");
        
popup.add(mniDel);
popup.add(mniClose);
       
 
invoker.addFocusListener(new FocusListener() {
			
			@Override
			public void focusLost(FocusEvent e) {
				popup.setVisible(false);
				invoker.setVisible(false);
			}
			
			@Override
			public void focusGained(FocusEvent e) {
				popup.setVisible(true);
				invoker.setVisible(true);
			}
		}); 

invoker.setUndecorated(true);
invoker.setVisible(true);
popup.show(invoker, e.getX(), e.getY());
invoker.setLocation(e.getX(), e.getY());
invoker.setSize(popup.getPreferredSize());
invoker.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
 
Zuletzt bearbeitet von einem Moderator:
Zurück