JPopupMenu über JFrame-Rand

tdt_kharn

Grünschnabel
Hallo :)

Ich habe schon einige Male nützliche Tips finden können hier, deswegen dachte ich, poste ich mal ein Problem, an dem ich mir derzeit die Zähne ausbeisse.

Mit einem Click auf einen JButton wird ein JPopupMenu, gefüllt mit einem JTextField, gezeigt. Dieses JTextField soll nun editiert werden, dazu klicke ich mit der Maus auf das JPopupMenu bzw in das JTextField.
Liegen die Begrenzungen des JPopupMenus komplett innerhalb des Hauptframes, dann funktioniert alles wie gewünscht. Ragt das JPopupMenu allerdings an einer Seite über die Grenzen des JFrames hinaus, und es wird ins JPopupMenu geklickt, dann wird das JPopupMenu nach hinten, hinter das JFrame Fenster gesetzt. Das JTextField ist zwar angewählt, aber nur noch teilweise bis gar nicht mehr zu sehen.

Meine Frage ist nun, ob man das JPopupMenu auf elegantem Wege dazu bewegen kann, nicht hinter dem JFrame zu verschwinden?

Hier ist der Beispielcode, der das Problem zeigt. (natürlich nicht besonders schön :) )

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TestFrame extends JFrame implements MouseListener{
	
	public JButton button1;
	public JPopupMenu popupMenu;
	public JTextField field;
	
	public TestFrame(){
	
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		button1 = new JButton("test");
		button1.addMouseListener(this);
		
		this.add(button1);
		
		field = new JTextField("blubb");
		field.setPreferredSize(new Dimension(100,20));
		 
		popupMenu = new JPopupMenu();
		popupMenu.setBorder(BorderFactory.createCompoundBorder(
				BorderFactory.createEtchedBorder(),
				BorderFactory.createEmptyBorder(15, 15, 15, 15) ));
		popupMenu.add(field);
	}
	
	public void mouseClicked(MouseEvent e){
		popupMenu.show(e.getComponent(), e.getX(), e.getY());
		
		Window window = SwingUtilities.windowForComponent(popupMenu);
		if(window!=null){
			window.setFocusableWindowState(true);
			window.setAlwaysOnTop(true);
		}
		KeyboardFocusManager.getCurrentKeyboardFocusManager()
						   .focusNextComponent(popupMenu);
	}
	public void mouseEntered(MouseEvent e){}
	public void mouseExited(MouseEvent e){}
	public void mousePressed(MouseEvent e){}
	public void mouseReleased(MouseEvent e){}
}

(Einen Workaround hab ich schon gefunden, nämlich statt eines JPopupMenus ein undecorated JFrame erscheinen zu lassen. Aber das ist mühsam im richtigen Programm, weil dort die Funktionen von JMenus nicht direkt benutzt werden können.
Deswegen hier die Frage, ob man das JPopupMenu richtig hinbiegen kann. :) )

Viele Grüsse,
Sebastian
 
Zurück