8.4.9 | JPopupMenu |
Ein JPopupMenu ist ein Fenster, welches typischerweise als Kontextmenü dient und Menüpunkte in sich aufnehmen kann.
Bis zur Version 1.4 wurde das JPopupMenu auch gerne dazu genutzt, andere Komponenten als nur JMenuItems aufzunehmen, indem man sein eigenes Layout setzt und die eigenen Komponenten hinzufügt - man verwendete das JPopupMenu also als normales Popup. Die in Version 1.4neu eingeführte Klasse Popup sollte in diesem Fall verwendet werden. Allerdings fehlt bei der Klasse Popup die Fähigkeit, dass sich das Popup automatisch wieder schließt, wenn der Benutzer auf das ursprüngliche Fenster klickt.
Ein JPopupMenu wird, wenn es nur über Lightweight-Komponenten liegt, auch als solches initialisiert. Wenn das JPopupMenu über den Rand des darunter liegenden Fensters hinausragt, wird eine Heavyweight-Implementierung genommen (es wird dafür ein JWindow benutzt, auf dem die Komponenten gezeichnet werden).
Wer keine Lightweight-Implementierung möchte, kann dies über
setLightWeightPopupEnabled(false)
erreichen.
Ein sichtbares JPopupMenu verschwindet, wenn man einen Menüpunkt auswählt oder der Benutzer neben dieses Popup klickt.
Um ein JPopupMenu als Kontextmenü darzustellen, muss bei der entsprechenden Komponente ein MouseListener registriert werden. Hierbei ist zu beachten, dass je nach Plattform der Event, der ein Popup starten soll, unterschiedlich sein kann. Somit sollte man sowohl bei mousePressed(MouseEvent e) als auch bei mouseReleased(MouseEvent e) überprüfen, ob isPopupTrigger() den Wert true liefert.
JLabel label = new JLabel("Bitte rechtsklicken"); popup = new JPopupMenu (); popup.add(new AbstractAction( "Neu", new ImageIcon( getClass().getResource("t1.gif"))) { public void actionPerformed (ActionEvent e) { // etwas Sinnvolles tun } }); // ... label.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { if (e.isPopupTrigger()) popup.show(e.getComponent(), e.getX(), e.getY()); } public void mouseReleased(MouseEvent e) { if (e.isPopupTrigger()) popup.show(e.getComponent(), e.getX(), e.getY()); } });