Vorlesung Informatik 1 - Teil A: Java Kurs

1.10 Events und Listener

  • Manche Objekte können ein Ereignis auslösen, z.B. ein JButton, auf den geklickt wird.  Ein solches Objekt wird als Ereignisquelle (engl. event source) bezeichnet. 
  • Das ausgelöste Ereignis (also der Klick auf den Button, engl. event) ist dann ein Objekt vom Typ ActionEvent. Ein ActionEvent Objekt enthält z.B. den auf eine Millisekunde genauen Zeitpunkt des Klicks, das Objekt, welches den Klick ausgelöst hat, ob die rechte oder linke Maustaste gedrückt wurde u.s.w..
  • Um auf ein Ereignis reagieren zu können, schreiben wir eine Klasse, die das Interface java.awt.event.ActionListener implementiert. Es fordert folgende Methode:
         public void actionPerformed(ActionEvent e){ ... }
    man nennt diese Klasse die Listener-Klasse (Horcher-Klasse).
  • Ein Objekt der Listener-Klasse wird als Listener bezeichnet. Es wartet darauf, dass das Ereignis passiert. Wenn ja, ruft das Betriebssystem die actionPerfomed-Methode auf, das Ereignis wird dabei als Parameter übergeben.
  • Damit das Betriebssystem weiß, das der Listener auf den Klick auf einen Button wartet, müssen wir ihn registrieren
           public class Klick implements ActionListener{
                  public void actionPerformed(ActionEvent e){
                       System.out.println("Klick");
                  }
           }
          public class Aufgabexx extends StandardAnwendung{
              ...
                public Aufgabexx(){
                     super("Aufgabe xx", 500, 400);
                     JButton knopf = new JButton("Klick mal");
                     knopf.addActionListener(new Klick());
                         ...
                }
          }
    Bei jedem Klick auf den Knopf wird jetzt 'Klick' auf die Konsole geschrieben.
  • Neben ActionListener werden wir später noch noch MouseListener und MouseMotionListener verwenden.
  • Man kann auch den JButton selbst zur eigenen Listener-Klasse machen, dann hat man die ganze Funktionalität in einer Klasse:
          class KlickButton extends JButton implements ActionListener{
                public KlickButton(){
                      super("Klick mal");
                      this.addActionListener(this);
                }
                public void actionPerformed(ActionEvent e){
                      System.out.println("Klick");
                }
          }

    Für kleine Anwendungen ist das oft eine gute Aufteilung der Klassen
  • Beispiel: ein Button, der ein JPanel rot färbt:
          class PanelRotButton extends JButton implements ActionListener{
                private JPanel panel;
                public PanelRotButton(JPanel panel){
                      super("ROT");
                      this.panel = panel;
                      this.addActionListener(this);
                }
                public void actionPerformed(ActionEvent e){
                      panel.setBackground(Color.RED);
                }
          }

    Die Instanzvariable panel wird im Konstruktor gesetzt. Sie behält ihren Wert solange wie das Objekt existiert. In actionPerformed wird der Wert verwendet.

Weiterführende Links

Kapitel zu UML in Java ist auch eine Insel

Lehrvideo  (YouTube)