Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 3. Auflage |
<< | < | > | >> | API | Kapitel 30 - Menü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 geeigneter 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-and-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. |
|
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 /* Listing3006.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 Listing3006 034 extends Frame 035 implements ActionListener 036 { 037 MyPopupMenu popup; 038 039 public static void main(String[] args) 040 { 041 Listing3006 wnd = new Listing3006(); 042 } 043 044 public Listing3006() 045 { 046 super("Kontextmenü"); 047 setLocation(100,100); 048 setSize(300,200); 049 setVisible(true); 050 addWindowListener(new WindowClosingAdapter(true)); 051 //Kontextmenü erzeugen und aktivieren 052 popup = new MyPopupMenu(this); 053 add(popup); 054 enableEvents(AWTEvent.MOUSE_EVENT_MASK); 055 } 056 057 public void processMouseEvent(MouseEvent event) 058 { 059 if (event.isPopupTrigger()) { 060 popup.show( 061 event.getComponent(), 062 event.getX(), 063 event.getY() 064 ); 065 } 066 super.processMouseEvent(event); 067 } 068 069 public void actionPerformed(ActionEvent event) 070 { 071 System.out.println(event.getActionCommand()); 072 } 073 } |
Listing3006.java |
Abbildung 30.4 zeigt den Aufruf des Kontextmenüs:
Abbildung 30.4: Aufruf eines Kontextmenüs
Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 3. Auflage, Addison Wesley, Version 3.0.1 |
<< | < | > | >> | API | © 1998-2003 Guido Krüger, http://www.javabuch.de |