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.5 Action-Events



Ein Action-Event wird generiert, wenn der Anwender einen Menüpunkt selektiert und ausgewählt hat. Das Programm kann den auslösenden Menüeintrag bestimmen und so geeignet darauf reagieren. Action-Events werden von der Klasse MenuItem und drei weiteren Klassen (auf die wir in den folgenden Kapiteln zurückkommen) gesendet:

Ein Empfänger für Action-Events muß das Interface ActionListener implementieren und bekommt Events des Typs ActionEvent übergeben. ActionEvent erweitert die Klasse AWTEvent und stellt neben getID und getSource vor allem die Methode getActionCommand zur Verfügung, mit der die verschiedenen Ereignisquellen unterschieden werden können:

public String getActionCommand()
java.awt.event.ActionEvent

Wird das Action-Event durch ein MenuItem ausgelöst, liefert dessen Methode getActionCommand die Bezeichnung des Menüpunktes, wie sie an den Konstruktor übergeben wurde. Durch einen expliziten Aufruf von setActionCommand kann dieser String auch unabhängig von der Beschriftung des Menüpunkts geändert werden. Ein Aufruf von getActionCommand liefert den aktuellen Inhalt des Menüpunkts bzw. seine Beschriftung, falls setActionCommand noch nicht aufgerufen wurde:

 Hinweis 

public void setActionCommand(String command)

public String getActionCommand()
java.awt.MenuItem

Die Registrierung der Empfängerklasse erfolgt mit der Methode addActionListener, die in den Klassen MenuItem, Button, List und TextField zur Verfügung steht:

public void addActionListener(ActionListener l)
java.awt.Button

Das Interface ActionListener stellt lediglich die Methode actionPerformed zur Verfügung, die beim Aufruf ein ActionEvent übergeben bekommt:

public abstract void actionPerformed(ActionEvent e)
java.awt.event.ActionListener

Üblicherweise wird in actionPerformed zunächst durch Aufruf von getActionCommand und/oder getSource die Quelle des Action-Events ermittelt, bevor der Code folgt, der die Reaktion auf das Ereignis implementiert.

 Tip 

Das folgende Programm zeigt die Reaktion auf Action-Events. Das Programm öffnet ein Fenster, das mit Hilfe von Menüeinträgen auf dem Bildschirm verschoben oder in der Größe verändert werden kann:

001 /* Listing2005.java */
002 
003 import java.awt.*;
004 import java.awt.event.*;
005 
006 import java.awt.*;
007 import java.awt.event.*;
008 
009 class MainMenu4
010 extends MenuBar
011 {
012    private MenuItem miRueck;
013    private CheckboxMenuItem miFarbe;
014 
015    private static void
016    addNewMenuItem(Menu menu, String name, ActionListener listener)
017    {
018       int pos = name.indexOf('&');
019       MenuShortcut shortcut = null;
020       MenuItem mi;
021       if (pos != -1) {
022          if (pos < name.length() - 1) {
023             char c = name.charAt(pos + 1);
024             shortcut=new MenuShortcut(Character.toLowerCase(c));
025             name=name.substring(0,pos)+name.substring(pos + 1);
026          }
027       }
028       if (shortcut != null) {
029          mi = new MenuItem(name, shortcut);
030       } else {
031          mi = new MenuItem(name);
032       }
033       mi.setActionCommand(name);
034       mi.addActionListener(listener);
035       menu.add(mi);
036    }
037 
038    public MainMenu4(ActionListener listener)
039    {
040       Menu m;
041 
042       //Menü "Größe"
043       m = new Menu("Größe");
044       addNewMenuItem(m, "&Größer", listener);
045       addNewMenuItem(m, "&Kleiner", listener);
046       m.addSeparator();
047       addNewMenuItem(m, "B&eenden", listener);
048       add(m);
049 
050       //Menü "Position"
051       m = new Menu("Position");
052       addNewMenuItem(m, "&Links", listener);
053       addNewMenuItem(m, "&Rechts", listener);
054       addNewMenuItem(m, "&Oben", listener);
055       addNewMenuItem(m, "&Unten", listener);
056       add(m);
057    }
058 }
059 
060 public class Listing2005
061 extends Frame
062 implements ActionListener
063 {
064    public static void main(String[] args)
065    {
066       Listing2005 wnd = new Listing2005();
067    }
068 
069    public Listing2005()
070    {
071       super("Listing2005");
072       setLocation(100,100);
073       setSize(300,200);
074       setMenuBar(new MainMenu4(this));
075       setVisible(true);
076       addWindowListener(
077          new WindowAdapter() {
078             public void windowClosing(WindowEvent event)
079             {
080                setVisible(false);
081                dispose();
082                System.exit(0);
083             }
084          }
085       );
086    }
087 
088    public void paint(Graphics g)
089    {
090       Insets   in = getInsets();
091       Dimension d = getSize();
092       g.setColor(Color.red);
093       g.drawLine(
094          in.left, in.top,
095          d.width - in.right, d.height - in.bottom
096       );
097       g.drawLine(
098          in.left, d.height - in.bottom,
099          d.width - in.right, in.top
100        );
101    }
102 
103    public void actionPerformed(ActionEvent event)
104    {
105       String cmd = event.getActionCommand();
106       if (cmd.equals("Größer")) {
107          Dimension d = getSize();
108          d.height *= 1.05;
109          d.width  *= 1.05;
110          setSize(d);
111       } else if (cmd.equals("Kleiner")) {
112          Dimension d = getSize();
113          d.height *= 0.95;
114          d.width  *= 0.95;
115          setSize(d);
116       } else if (cmd.equals("Beenden")) {
117          setVisible(false);
118          dispose();
119          System.exit(0);
120       } else if (cmd.equals("Links")) {
121          setLocation(getLocation().x-10, getLocation().y);
122       } else if (cmd.equals("Rechts")) {
123          setLocation(getLocation().x+10, getLocation().y);
124       } else if (cmd.equals("Oben")) {
125          setLocation(getLocation().x, getLocation().y-10);
126       } else if (cmd.equals("Unten")) {
127          setLocation(getLocation().x, getLocation().y+10);
128       }
129    }
130 }
Listing2005.java
Listing 20.5: Reaktion auf Action-Events aus einem Menü

 Beispiel 

Das Programm besitzt eine Klasse MainMenu4, in der das Menü definiert wird. Um die Definition der Menüeinträge zu vereinfachen, wurde die Methode addNewMenuItem implementiert, die einen neuen Menüeintrag erzeugt, ggfs. mit einem Beschleuniger versieht, den ActionListener registriert und schließlich an das übergebene Menü anhängt. Der erste Parameter von addnewMenuItem ist das Menü, für das ein Menüeintrag erstellt werden soll. Der zweite Parameter ist die Bezeichnung des Menüeintrags. Ist darin ein »&« enthalten, so wird dieses als Präfix für die Beschleunigertaste angesehen und der nachfolgende Buchstabe als Beschleuniger registriert. Anschließend wird das »&« entfernt. Als drittes Argument wird der ActionListener übergeben, der beim Menüeintrag registriert werden soll.

Wir verwenden in diesem Beispiel lediglich einen einzigen ActionListener, der bei allen Menüeinträgen registriert wird. Über den this-Zeiger wird das Fenster an den Konstruktor von MainMenu4 übergeben und von dort an addNewMenuItem weitergegeben. Voraussetzung dafür ist, daß das Fenster das Interface ActionListener implementiert und die Methode actionPerformed zur Verfügung stellt.

 Hinweis 

Die Unterscheidung der verschiedenen Ereignisquellen wird innerhalb von actionPerformed durch Aufruf von getActionCommand erledigt. Deren Rückgabewert wird abgefragt, um das passende Kommando auszuführen. Die Größenänderung erfolgt durch Aufruf von getSize und setSize, die Positionierung mit getLocation und setLocation. Zur Kontrolle zeichnet das Programm in paint zwei rote Diagonalen über die volle Länge der Client-Area:

Abbildung 20.3: Ein Programm, das auf Action-Events reagiert


 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