19.4 Mehrere Ereignisse
 
ein Rechner entsteht Die nächsten beiden Bilder zeigen einen Rechner, der über zwei Funktionen verfügt. In den Eingabefeldern werden die Werte von a und b eingegeben. In unserem Beispiel sind es die Werte 144 bzw. 60. Im Ausgabefeld erscheint, je nachdem, welcher Button gedrückt wurde der ggT der beiden Zahlen, also 12 bzw. das kgV der beiden Zahlen, also 720.

 

In diesem Kapitel lernen wir, wie wir ein Javaprogramm schreiben, das auf Drücken unterschiedlicher Buttons auch unterschiedlich reagiert. Wir schauen uns dazu den Quelltext des Programms etwas genauer an.
 

Download:

Rechner. java


Mathematik. class
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Rechner extends JFrame implements ActionListener{
  // Anfang Variablen
 
JPanel centerPanel, nordPanel;
  JLabel aLabel, bLabel;
  JButton ggTButton, kgVButton;
  JTextField eingabeFeldA, eingabeFeldB, ausgabeFeld;
  // Ende Variablen

 
public Rechner (String title) {
    // Frame-Initialisierung
   
super (title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing (WindowEvent evt) {
          System.exit(0);
      }
    });
    setSize(250, 100);
    Container cp = getContentPane();
    cp.setLayout(new BorderLayout());
   
    nordPanel = new JPanel(new GridLayout());
    cp.add(nordPanel,BorderLayout.NORTH);

    centerPanel = new JPanel(new GridLayout(1,2,10,10));
    cp.add(centerPanel,BorderLayout.CENTER);
   

    // Anfang Komponenten
   
   
aLabel = new JLabel("a:");
    nordPanel.add(aLabel);

    eingabeFeldA = new JTextField("0");
    eingabeFeldA.setHorizontalAlignment(eingabeFeldA.RIGHT);
    nordPanel.add(eingabeFeldA);

    bLabel = new JLabel("b:");
    nordPanel.add(bLabel);

    eingabeFeldB = new JTextField("0");
    eingabeFeldB.setHorizontalAlignment(eingabeFeldB.RIGHT);
    nordPanel.add(eingabeFeldB);
   
   
    ggTButton = new JButton("ggT");
    centerPanel.add(ggTButton);
    ggTButton.addActionListener(this);
   
    kgVButton = new JButton("kgV");
    centerPanel.add(kgVButton);
    kgVButton.addActionListener(this);
   
    ausgabeFeld = new JTextField();
    ausgabeFeld.setHorizontalAlignment(ausgabeFeld.RIGHT);
    cp.add(ausgabeFeld,BorderLayout.SOUTH);
    ausgabeFeld.setEditable(false);
   
    // Ende Komponenten

   
setVisible(true);
  }

  // Anfang Ereignisprozeduren
 
public void actionPerformed(ActionEvent e){                   
                                                                
    String ausgabeText="";                                      
    int eingabeWertA = Integer.parseInt(eingabeFeldA.getText());
    int eingabeWertB = Integer.parseInt(eingabeFeldB.getText());
                                                                
    Object obj = e.getSource();                                 
                                                                
    if(obj == ggTButton){                                       
      ausgabeText = ""+Mathematik.ggT(eingabeWertA,eingabeWertB);
    }                                                           
    if(obj == kgVButton){                                       
      ausgabeText = ""+Mathematik.kgV(eingabeWertA,eingabeWertB);
    }                                                           
                                                                
    ausgabeFeld.setText(ausgabeText);                           
  }                                                             

  // Ende Ereignisprozeduren

 
public static void main (String[] args) {
    new Rechner("Rechner");
  }
}
 
Beschrei- bung Die wesentlichen Veränderungen sind gelb unterlegt. Die erste so markierte Stelle ´zeigt eine Modifikation des GridLayouts. Die Parameter 1,2,10,10 besagen, dass die in diesem Panel abgelegte Objekte in einer Zeile und 2 Spalten abgelegt werden. Zwischen den Buttons werden in horizontaler und vertikaler Richtung jeweils 10 Pixel Abstand gehalten. Die so für die Aufnahme von Grafikobjekten vorbereiteten Felder werden in der Reihenfolge, wie sie auf dem Panel abgelegt werden, eingefügt,

Die zweite Veränderung:

Wird ein Button gedrückt, so sendet es ein Objekt der Klasse ActionEvent an seine Empfänger aus. Der Empfänger muss dazu registriert sein.

ggTButton.addActionListener(this);

Diese Zeile bewirkt, dass der ggTButton belauscht wird und damit seine Botschaften wahrgenommen werden. An wen werden sie geschickt? Das steht in der Klammer. Als Empfänger kommen Objekte des Typs ActionListener in Frage, also Objekte, deren Klassen das Interface ActionListener implementiert haben. Unsre Klasse Rechner erfüllt diese Bedingung, wird also durch this in der Klammer zum Empfänger, kann also die Botschaft empfangen und entsprechend darauf reagieren. Natürlich könnte in der Klammer auch ein anderes Empfänger-Objekt stehen.

Nun bekommt der Rechner über den "Lauscher" mit , dass ein Button gedrückt ist. Welcher Button war es aber? Mit der Methode getSource() aus der Klasse ActionEvent ermittelt das Ereignis, das in obj einem Objekt der Klasse Object gespeichert ist. Warum wird das Ereignis gerade in dieser Klasse speichern, werden wir später besser verstehen. Der Rest ist nun einfach und erklärt sich von selbst: Wir fragen den Inhalt von obj (z.B. if( obj == ggTButton)) und berechnen die Ausgabe entsprechend.
 

zu 19.5 Der komplette Rechner
zur Startseite www.pohlig.de  (C) MPohlig 2003