next up previous contents index
Next: Die Komponenten im Java Up: Grafische Benutzungsschnittstellen Previous: Grafische Benutzungsschnittstellen

Das Ereignis-Modell des AWT (ab JDK1.1)

   

Ereignisse werden von Ereignisquellen erzeugt. Ein oder mehrere Listener melden sich an, um über die Ereignisse an einer Quelle informiert zu werden.

Das Modell heißt Delegation  :

die Ereignisbehandlung wird an irgendein Objekt delegiert, das das zum Ereignis passende Interface implementiert.

Zur Ereignisbehandlung brauchen wir folgendes

1.
Eine Klasse für die Ereignisbehandlung. Sie muß das Interface für das zugehörige Ereignis implementieren, z.B.:

   public class MyEvtHdl
   implements ActionListener
   { ...

2.
Anmelden eines Listeners bei einer Ereignisquelle, z.B.:

   quitknopf.addActionListener(
                  new MyEvtHdl());

3.
Implementierung der versprochenen Event-Handling-Methoden, z.B.:

   public void actionPerformed(
       ActionEvent e)
   { // irgendwie auf das
     // Ereignis reagieren

Beispiel: Ein piepsender Knopf

Hier ist der ActionListener selbst Besitzer des Knopfes. Das muß natürlich nicht so sein.

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Beeper 
   extends Applet 
   implements ActionListener 
{ Button button;
  public void init() 
  { setLayout(new BorderLayout());
    button = new Button("Click Me");
    add("Center", button);
    button.addActionListener(this);
  }

  public void actionPerformed(
                  ActionEvent e) 
  { Toolkit.getDefaultToolkit().beep();
  }
}

Oft nutzt man die neuen inneren Klassen   für die Eventbehandlung:

public class Beeper1 
   extends Applet 
{ Button button;
  public void init() 
  { setLayout(new BorderLayout());
    button = new Button("Click Me");
    add("Center", button);
    button.addActionListener(
          new BeepAction());
  }

  class BeepAction 
    implements ActionListener 
  { public void actionPerformed(
              ActionEvent e) 
    { Toolkit.getDefaultToolkit().beep();
    }
  }
}

Wenn nur ein Handler-Objekt benötigt wird: anonyme Klassen    :

public class Beeper2
   extends Applet 
{ Button button;
  public void init() 
  { setLayout(new BorderLayout());
    button = new Button("Click Me");
    add("Center", button);
    button.addActionListener(
          new ActionListener()
          { public void actionPerformed(
                  ActionEvent e) 
            { Toolkit.getDefaultToolkit().
                      beep();
            }
          }
          );
  }
}

Zum Vergleich: das alte Ereignisbehandlungsmodell

Nicht objektorientiert. Anwender macht Fallunterscheidung über Event-Typen und Event-Ziele:

public class Beeper3
   extends Applet 
{ // JDK 1.0 Event Handling
  Button button;
  public void init() 
  { setLayout(new BorderLayout());
    button = new Button("Click Me");
    add("Center", button);
  }
  public boolean action(Event e,
                        Object arg)
  { if (e.target.equals(button))
      Toolkit.getDefaultToolkit().beep();
    else return super.action(e,arg);
    return true;
  }
}

Adapterklassen

  Wenn ein Listener-Interface mehrere Methoden fordert (z.B. MouseListener), man aber nur an einer Art von Event interessiert ist, ist es lästig, alle geforderten Methoden (mit leerem Rumpf) zu implementieren.

Adapterklassen lösen das Problem, indem sie für alle Methoden des Interfaces leere Default-Implementierungen bereitstellen. Man erbt von einer Adapterklasse und überschreibt die benötigte Eventhandling-Methode:

    MyClass extends MouseAdapter
    { ....
      public void mouseClicked(
                     MouseEvent e)
      { ...
      }
    }
    ...
    button.addMouseListener(new MyClass());

Listener und Behandlungsmethoden

Für alle Eventarten mit mehr als einer Behandlungsmethode existiert eine Adapterklasse entsprechenden Namens.

Beispiel: Listener: KeyListener Adapter: KeyAdapter


tabular2346


tabular2378


next up previous contents index
Next: Die Komponenten im Java Up: Grafische Benutzungsschnittstellen Previous: Grafische Benutzungsschnittstellen

Peter Pfahler, 1997