Tit   Inh   Ind   1   2   3   4   5   6   7   8   9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32   <<   <   >   >> 

20.6 Kontextmenüs



Ein wichtiger Bestandteil grafischer Oberflächen, der in den letzten Jahren verstärkt in die Programme Einzug gehalten hat, sind die Kontext- oder Popup-Menüs. Sie liefern auf rechten Mausklick ein Menü mit den wichtigsten Aktionen, die innerhalb der ausgewählten Komponente zur Verfügung stehen. Auf diese Weise steht eine Vielzahl von Funktionen dort zur Verfügung, wo sie benötigt wird, anstatt umständlich aus dem Hauptmenü des Programms ausgewählt oder per Kommando eingegeben werden zu müssen.

Auch im JDK 1.1 gibt es Kontextmenüs, die so funktionieren. Sie werden durch die Klasse PopupMenu, die aus Menu abgeleitet ist, implementiert. PopupMenu ist genauso zu bedienen wie Menu und wird daher vor allem mittels geeignter Aufrufe von add mit Menüeinträgen bestückt. Diesen kann ein ActionListener zugeordnet werden, der bei Auslösen des Menüpunkts aufgerufen wird. Gegenüber der Klasse Menu besitzt PopupMenu eine zusätzliche Methode show, mit der das Kontextmenü angezeigt wird:

public void show(Component origin, int x, int y)
java.awt.PopupMenu

Der erste Parameter origin ist die Komponente, an die das Kontextmenü gebunden wird. Diese Komponente hat lediglich administrative Aufgaben, spielt aber beim Aufruf des Kontextmenüs keine Rolle. Die Argumente x und y geben die Position des Kontextmenüs relativ zum Ursprung von origin an.

Um ein Kontextmenü aufzurufen, sind mehrere Dinge zu tun. Zunächst muß das instanzierte Kontextmenü durch Aufruf von add an die Komponente gebunden werden, die auf Mausereignisse für den Aufruf reagieren soll. Dies kann beispielsweise das Fenster sein, in dem die Komponente untergebracht ist, oder die Komponente selbst. Anschließend muß in der Komponente durch Aufruf von enableEvents die Behandlung von Maus-Events freigeschaltet werden. Drittens muß die Methode processMouseEvent überlagert werden, und es muß bei jedem Mausereignis mit isPopupTrigger abgefragt werden, ob es sich um das Ereignis zum Aufruf des Kontextmenüs handelte. In diesem Fall kann das Kontextmenü durch Aufruf von show angezeigt werden.

Kontextmenüs sind von Plattform zu Plattform leicht unterschiedlich implementiert, und insbesondere die Art des Aufrufs unterscheidet sich voneinander (zweite oder dritte Maustaste, Aufruf beim Drücken oder Loslassen usw.). Um das Look & Feel des jeweiligen Systems beizubehalten, sollte processMouseEvent überlagert werden, um bei jeder Art von Mausereignis feststellen zu können, ob der PopupMenu-Trigger ausgelöst wurde. Der einfache Aufruf von show aus einem mousePressed- oder mouseReleased-Ereignis heraus ist nicht portabel und sollte daher vermieden werden.

 Hinweis 

Das folgende Beispiel zeigt ein Programm mit einem Kontextmenü, das die Punkte »Rückgängig«, »Ausschneiden«, »Kopieren« und »Einfügen« enthält. Das Kontextmenü wird an das Hauptfenster gehängt und von Mausereignissen dieses Fensters aufgerufen. Beim Auslösen einer Option des Kontextmenüs wird eine entsprechende Meldung auf die Systemkonsole geschrieben.

001 /* Listing2006.java */
002 
003 import java.awt.*;
004 import java.awt.event.*;
005 
006 class MyPopupMenu
007 extends PopupMenu
008 {
009    public MyPopupMenu(ActionListener listener)
010    {
011       MenuItem mi;
012 
013       mi = new MenuItem("Rueckgaengig");
014       mi.addActionListener(listener);
015       add(mi);
016 
017       addSeparator();
018 
019       mi = new MenuItem("Ausschneiden");
020       mi.addActionListener(listener);
021       add(mi);
022 
023       mi = new MenuItem("Kopieren");
024       mi.addActionListener(listener);
025       add(mi);
026 
027       mi = new MenuItem("Einfuegen");
028       mi.addActionListener(listener);
029       add(mi);
030    }
031 }
032 
033 public class Listing2006
034 extends Frame
035 implements ActionListener
036 {
037    MyPopupMenu popup;
038 
039    public static void main(String[] args)
040    {
041       Listing2006 wnd = new Listing2006();
042    }
043 
044    public Listing2006()
045    {
046       super("Listing2006");
047       setLocation(100,100);
048       setSize(300,200);
049       setVisible(true);
050       addWindowListener(
051          new WindowAdapter() {
052             public void windowClosing(WindowEvent event)
053             {
054                setVisible(false);
055                dispose();
056                System.exit(0);
057             }
058          }
059       );
060       //Kontextmenü erzeugen und aktivieren
061       popup = new MyPopupMenu(this);
062       add(popup);
063       enableEvents(AWTEvent.MOUSE_EVENT_MASK);
064    }
065 
066    public void processMouseEvent(MouseEvent event)
067    {
068       if (event.isPopupTrigger()) {
069          popup.show(
070             event.getComponent(),
071             event.getX(),
072             event.getY()
073          );
074       }
075       super.processMouseEvent(event);
076    }
077 
078    public void actionPerformed(ActionEvent event)
079    {
080       System.out.println(event.getActionCommand());
081    }
082 }
Listing2006.java
Listing 20.6: Einbinden eines Kontextmenüs

 Beispiel 

Abbildung 20.4 zeigt den Aufruf des Kontextmenüs:

Abbildung 20.4: Aufruf eines Kontextmenüs


 Tit   Inh   Ind   1   2   3   4   5   6   7   8   9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32   <<   <   >   >> 
Go To Java 2, Addison Wesley, Version 1.0.2, © 1999 Guido Krüger, http://www.gkrueger.com