15.18 Popup-Menüs
Popup-Menüs sind nicht wie normale Menüs an eine bestimmte Position gebunden, sondern tauchen meistens dort auf, wo der Benutzer mit der rechten Maustaste geklickt hat. Ein anderer oft gebrauchter Name ist Kontextmenü, da das Menü verschiedene Einträge bei unterschiedlichen Kontexten besitzt. Ein Beispiel sind grafische Oberflächen. Wenn wir dort auf einer Datei das Kontextmenü bemühen, findet sich ein Eintrag wie »Öffnen« und »Bearbeiten«. Auf einem Verzeichnis fehlen jedoch solche Bearbeitungsmöglichkeiten.
Popup-Menüs sollen die Navigation erleichtern, deshalb sollten sie nicht zu lang sein oder zu viele Ebenen besitzen. Gleiches gilt übrigens auch für die Menüstruktur. Wenn es mehr als drei Ebenen werden, sollte über eine Neugestaltung nachgedacht werden.
Tipp Popup-Menüs müssen kurz gehalten werden. Zu viele Ebenen sind ebenso zu vermeiden wie lange Auswahllisten. Wenn der Benutzer am unteren Rand ist, so ist nicht abzuschätzen, wo die Auswahlliste angezeigt wird.
|
Hier klicken, um das Bild zu Vergrößern
Abbildung 15.16 Ein Popup-Menü
Die Klasse JPopupMenu
Für Popup-Menüs ist die Klasse JPopupMenu (PopupMenu unter dem AWT) zuständig. Die Menüeinträge können wir, wie auch in normalen Menüs, mit der Klasse Menu erzeugen.
Popup-Menüs unterscheiden sich vom Aufbau her nicht von normalen Menüs, das heißt, wir können auch hier Trennlinien einfügen und Shortcuts definieren. Ein Popup-Menü wird wie jede andere Komponente mit der Methode add() zum Pane eines JFrame-Objekts hinzugefügt.
Beispiel Erzeuge ein Popup-Menü mit zwei Einträgen.
JPopupMenu popmen = new JPopupMenu();
JMenuItem menu1 = new JMenuItem( "Eintrag 1");
popmen.add( menu1 );
popmen.add( new JMenuItem( "Eintrag 2") );
|
Danach können wir sie mit der show()-Methode aufspringen (daher der Name »Popup«) lassen. Der Methode müssen die Komponente, auf der das Menü aufspringen soll, und die Koordinaten übergeben werden.
Beispiel Ist unsere Klasse von JFrame abgeleitet, so tragen wir in den Konstruktor folgende Zeile ein, um das Popup-Menü hinzuzufügen:
getContentPane().add( popmen );
|
Die Anzeige erfolgt mit show().
popmen.show( this, 100,100 );
class javax.swing.JPopupMenu
extends JComponent
implements Accessible, MenuElement
|
|
JPopupMenu()
Erzeugt ein Popup-Menü. |
|
JMenuItem add( String s )
Fügt dem Popup-Menü einen Eintrag hinzu. |
|
JMenuItem add( JMenuItem menuItem )
Fügt dem Popup-Menü einen Eintrag hinzu. |
|
void addSeparator()
Fügt einen Trenner hinzu. |
|
void show( Component invoker, int x, int y)
Lässt das PopupMenu auf der Komponente invoker an der Position x, y aufspringen. |
Beispiel für ein JPopupMenu
Wir wollen nun ein Beispiel implementieren, welches ein Popup-Menü anzeigt. Gehen wir Schritt für Schritt durch das Programm. Zuerst binden wir die nötigen Pakete ein. Wir definieren eine Variable popmen für den Zugriff auf das Popup-Menü. Im Konstruktor definieren wir das ganze Verhalten.
Listing 15.24 PopMenDemo.java
import java.awt.event.*;
import javax.swing.*;
public class PopMenDemo extends JFrame
{
JPopupMenu popmen = new JPopupMenu();
PopMenDemo()
{
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
JMenuItem entryHead = new JMenuItem( "Kompaktstaubsauger" );
popmen.add( entryHead );
popmen.addSeparator();
Der erste Eintrag im Menü soll eine Überschrift sein. Dann sollen einige Einträge in das Popup-Menü folgen und mit einem ActionListener verbunden werden. Damit reagieren wir auf die Ereignisse, wenn der Benutzer einen Eintrag im Menü auswählt.
String staubsauger[] = {
"AEG Vampyrino SX", "Electrolux Clario Z 1941",
"Quelle Privileg Piccolino", "Siemens Super T120VS12A00",
"Hoover Micro Power Electronic SC 150", "Rowenta dymbo RS 014" };
JMenuItem entry[] = new JMenuItem[staubsauger.length];
ActionListener al = new ActionListener() {
public void actionPerformed( ActionEvent e )
{
System.out.println( e.getActionCommand() );
}
};
for ( int i = 0; i < staubsauger.length; i++ )
{
popmen.add( entry[i] = new JMenuItem( staubsauger[i] ) );
entry[i].addActionListener( al );
}
Der letzte Teil ist nun, dem JFrame einen Listener mitzugeben, der auf die Maustaste hört, damit das Kontextmenü aufgerufen werden kann. Wir ergänzen einen MouseListener. Im mouseReleased() werden wir dann mit show() das Menü öffnen.
addMouseListener( new MouseAdapter() {
public void mouseReleased( MouseEvent me ) {
if ( me.isPopupTrigger() )
popmen.show( me.getComponent(), me.getX(), me.getY() );
}
} );
setSize( 300,300 );
setVisible( true );
}
public static void main( String args[] )
{
new PopMenDemo();
}
}
Tipp Popup-Menüs sollten einen ersten nicht selektierbaren Eintrag besitzen. Dies macht die Auswahl nicht wesentlich langsamer, lässt aber das Abbrechen einer Operation einfacher zu.
|
|