Literatur

ActionEvent und ActionListener

Am häufigsten dürfte wohl der ActionListener zum Einsatz kommen. Dieser dient dazu, ActionEvents, wie z.B. das Betätigen einer Schaltfläche, zu erfassen.

Eine Klasse, die zum ActionListener werden soll, muss die Methode

void actionPerformed(ActionEvent e) 

implementieren.  

Diese Methode wird aufgerufen, wenn ein ActionEvent an einer angemeldeten Komponente auftritt. Dort muss also das gewünschte Verhalten, was auf das Ereignis erfolgen soll, implementiert werden. Als Parameter wird der Methode eine Referenz auf das ActionEvent-Objekt übergeben, über welches weitere Informationen über das Ereignis ermittelt werden können.

Die Klasse ActionEvent verfügt neben den Methoden, die die Elternklasse AWTEvent bietet, über die folgende Methoden:

Methodenname Beschreibung
String getActionCommand() Gibt das Aktionskommando der Komponente, mit dem die Aktion ausgelöst wurde, zurück. Wenn nichts anderes vorgegeben wurde, handelt es sich dabei um den Beschriftungstext der Komponente.
int getModifiers() Liefert eine bitweise Oder-Verknüpfung der Konstanten für die Sondertasten (z.B. SHIFT_MASK), die während der Aktionsauslösung gedrückt wurden.
long getWhen() Gibt den Zeitpunkt des Ereignisses als Zeitstempel zurück.

 

Wie man nun das Betätigen einer Schaltfläche durch Implementieren der Klasse ActionListener erfasst, möchten wir Ihnen anhand eines Beispiels erläutern:

 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
 
// Damit Objekte der Klasse BeispielListener
// zum ActionListener werden kann, muss das Interface
// ActionListener implementiert werden
public class BeispielListener extends JFrame implements ActionListener
{
    JButton button1;
    JButton button2;
    JButton button3;
    JLabel label;
    JPanel panel;
 
    public BeispielListener(){
        this.setTitle("ActionListener Beispiel");
        this.setSize(400, 200);
        panel = new JPanel();
 
        // Leeres JLabel-Objekt wird erzeugt
        label = new JLabel();
 
        //Drei Buttons werden erstellt
        button1 = new JButton("Button 1");
        button2 = new JButton ("Button 2");
        button3 = new JButton ("Button 3");
 
        //Buttons werden dem Listener zugeordnet
        button1.addActionListener(this);
        button2.addActionListener(this);
        button3.addActionListener(this);
 
        //Buttons werden dem JPanel hinzugefügt
        panel.add(button1);
        panel.add(button2);
        panel.add(button3);
 
        //JLabel wird dem Panel hinzugefügt
        panel.add(label);
        this.add(panel);
    }
 
    public static void main(String[] args)
    {
        // Ein neues Objekt der Klasse BeispielListener wird erzeugt
        // und sichtbar gemacht
        BeispielListener bl = new BeispielListener();
        bl.setVisible(true);
    }
 
    public void actionPerformed (ActionEvent ae){
        // Die Quelle wird mit getSource() abgefragt und mit den
        // Buttons abgeglichen. Wenn die Quelle des ActionEvents einer
        // der Buttons ist, wird der Text des JLabels entsprechend geändert
        if(ae.getSource() == this.button1){
            label.setText(("Button 1 wurde betätigt"));
        }
        else if(ae.getSource() == this.button2){
            label.setText("Button 2 wurde betätigt");
        }
        else if (ae.getSource() == this.button3){
            label.setText(("Button 3 wurde betätigt"));
        }
    }
}

Wir erstellen eine Klasse BeispielListener, die wir von JFrame ableiten, so dass Objekte unserer Klasse selber JFrames sind. Außerdem implementieren wir das Interface ActionListener,  indem wir in der Klassendeklaration "implements ActionListener" anhängen und die Methode actionPerformed implementieren. Unsere Klasse erhält als Attribute die Komponenten, die auf dem Frame angeordnet werden sollen: Ein Panel, drei Buttons und ein Label.

Beim Programmstart wird die main-Methode aufgerufen, in welchem wir ein Objekt unserer Klasse BeispielListener erzeugen. Dadurch wird der Konstruktor der Klasse aufgerufen, in welchem wir die Attribute, also unsere Komponenten, initialisieren und der BeispielListener-Instanz, die ja zugleich ein JFrame ist, hinzufügen. Damit das Programm auf Klicks der Buttons reagieren kann, muss den Buttons jeweils ein ActionListener zugewiesen werden. Dies tun wir, indem wir die Methode addActionListener aufrufen. Als Parameter übergeben wir die Referenz auf das ActionListener-Objekt, in diesem Fall also den this-Zeiger.

Wird zur Laufzeit ein Button geklickt, wird automatisch die actionPerformed-Methode des zuständigen ActionListeners aufgerufen. Da unser BeispielListener-Objekt als ActionListener für drei Buttons eingetragen wurde, müssen wir, um auf jeden Button unterschiedlich reagieren zu können, herausfinden, welcher genau gedrückt wurde. Dies machen wir, indem wir durch if-Abfragen die Quelle (mittels getSource) mit den Buttons vergleichen. In unserem Beispiel ändern wir das JLabel entsprechend.

 

ActionListener Beispiel

 

Häufig werden EventListener jedoch in Form anonymer innerer Klassen eingebunden. Nachfolgend sehen Sie ein Beispiel dafür.

 
import java.awt.BorderLayout;
import javax.swing.*;
 
public class MenuMitListener extends JFrame {
    // Menüleiste 
    JMenuBar menuBar;
 
    // Menü "Datei"
    JMenu fileMenu;
 
    // Menüpunkt "Öffnen"
    JMenuItem openItem;
 
    // Menüpunkt "Schließen"
    JMenuItem closeItem;
 
    public MenuMitListener() {
        this.setTitle("JMenu mit ActionListener");
        this.setSize(400, 300);
 
        // Menüleiste wird erzeugt
        menuBar = new JMenuBar();
 
        // Menü "Datei" wird erzeugt
        fileMenu = new JMenu("Datei");
 
        // Menüpunkte werden erzeugt
        openItem = new JMenuItem("Öffnen");
        closeItem = new JMenuItem("Schließen");
 
        // Menüpunkte werden dem Datei-Menü hinzugefügt
        fileMenu.add(openItem);
        fileMenu.add(closeItem);
 
        //Datei-Menü wird der Menüleiste hinzugefügt
        menuBar.add(fileMenu);
 
        //Menüleiste wird dem JFrame hinzugefügt
        this.add(menuBar, BorderLayout.NORTH);
 
        // ActionListener wird als anonyme Klasse eingebunden
        openItem.addActionListener(new java.awt.event.ActionListener() {
            // Beim Drücken des Menüpunktes wird actionPerformed aufgerufen
            public void actionPerformed(java.awt.event.ActionEvent e) {
                // Dateiauswahldialog wird erzeugt...
                JFileChooser fc = new JFileChooser();
                // ... und angezeigt
                fc.showOpenDialog(null);
            }
        });
 
        // ActionListener wird als anonyme Klasse eingebunden
        closeItem.addActionListener(new java.awt.event.ActionListener() {
            // Beim Drücken des Menüpunktes wird actionPerformed aufgerufen
            public void actionPerformed(java.awt.event.ActionEvent e) {
                //Programm schließen
                System.exit(0);
            }
        });
    }
 
 
    public static void main(String[] args) {
        MenuMitListener nml = new MenuMitListener();
        nml.setVisible(true);
    }
}
 

JMenu mit Listener

Wir haben eine Menüleiste mit dem Menüpunkt "Datei" versehen, welcher uns von den meisten Anwendungen vertraut sein dürfte. Dieser enthält die Menüpunkte "Öffnen" und "Schließen", welche jeweils über die Methode addActionListener einen ActionListener in Form einer anonymen Klasse zugewiesen bekommen. Auch hier muss die anonyme Klasse die actionPerformed-Methode implementieren. Diese wird an die unterschiedliche Funktion der beiden Menüpunkte angepasst: Für den Menüpunkt "Öffnen" wird ein Dateiauswahl-Dialog implementiert, während die actionPerformed-Methode des Menüpunktes "Schließen" dafür sorgt, dass das Programm geschlossen wird. In der Praxis sind natürlich noch einige andere Dinge für eine Öffnen- und Schließen-Funktionalität einer Anwendung notwendig (z.B. Sicherung der Daten vorm Schließen).