Wie reagiert ein Button beim Anklicken?
Schaltflächen wie JButton erzeugen bei Benutzung, wie viele andere Komponenten auch, sog. events.(Ereignisse). Je nach Komponente werden unterschiedliche Ereignisse ausgesandt. Bei Schaltflächen ist dies ein ActionEvent.
Da man normalerweise nicht an allen ausgesandten Ereignissen interessiert ist, muss man diejenigen, auf die man reagieren möchte abfangen. Hierzu steht für jedes spezielle Ereignis ein sog. Listener zur Verfügung, bei dem man die das Ereignis erzeugende Komponente anmelden muss.
In den folgenden drei Beispielen werden hierzu die gängigsten Verfahren anhand einer einfachen Schaltfläche vorgestellt, die bei Betätigung einen kurzen Text auf der Konsole ausgeben soll.
Der ActionListener selbst ist eine Schnittstelle, die von der interessierten Klasse implementiert werden muss.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;

public class ButtonEventClass extends JFrame implements ActionListener {
    
    private JButton button;
    
    public ButtonEventClass(){
        button = new JButton("click mich!");
        button.addActionListener(this);
        
        this.getContentPane().add(button);
    }
    
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == button){
            System.out.println("Button geklickt!");
        }
    }
    
    public static void main(String[] args){
        ButtonEventClass bec = new ButtonEventClass();
        bec.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        bec.setSize(200, 200);
        bec.setVisible(true);
    }
}
Im ersten Beispiel implementiert die Klasse, die den Button enthält den Listener selber. Somit muss sie selbst die Methode actionPerformed() enthalten, die als Parameter ein ActionEvent übergeben bekommt.
Der Ereignisauslöser muss jetzt durch die Methode addActionListener()mit dem Listener verbunden werden. Als Parameter wird ein Verweis auf den Konstruktor der eigenen Klasse übergeben, da die Klasse selbst den Listener ja implementiert.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;

public class ButtonEvent2Class extends JFrame {
    
    private JButton button;
    
    public ButtonEvent2Class(){
        button = new JButton("click mich!");
        button.addActionListener(new ButtonLauscher());
        
        this.getContentPane().add(button);
    }
    
    class ButtonLauscher implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            if(e.getSource() == button){
                System.out.println("Button geklickt!");
            }
        }
    }
    
    public static void main(String[] args){
        ButtonEvent2Class bec = new ButtonEvent2Class();
        bec.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        bec.setSize(200, 200);
        bec.setVisible(true);
    }
}
Im zweiten Beispiel wird der ActionListener in einer eigenen inneren Klasse realisiert, von der eine Instanz mit dem Button verbunden wird. Wie im ersten Beispiel auch kann mit der Methode ActionEvent.getSource() die Ereignisquelle ermittelt werden. Auf diese Weise kann ein Listener mehre Ereignisse überwachen.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;

public class ButtonEvent3Class extends JFrame {
    
    private JButton button;
    
    public ButtonEvent3Class(){
        button = new JButton("click mich!");
        button.addActionListener(new ButtonLauscher());
        
        this.getContentPane().add(button);
    }
    
    
    
    public static void main(String[] args){
        ButtonEvent3Class bec = new ButtonEvent3Class();
        bec.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        bec.setSize(200, 200);
        bec.setVisible(true);
    }
}

class ButtonLauscher implements ActionListener {
    public void actionPerformed(ActionEvent e) {
            System.out.println("Button geklickt!");
    }
}
Das dritte Beispiel entspricht in den Grundzügen dem zweiten. Jedoch ist der Listner nicht als innere, sondern als selbstständige Klasse realisiert. Hierdurch ist die Button-Instanz nicht mehr sichtbar und die Abfrage der Ereignisquelle würde sich ein klein Wenig komplizierter gestalten, da der Listener-Klasse ein Verweis auf die das Ereignis auslösende Komponente übergeben werden müsste.
letzte Änderung an:
switch-case-Verzweigung