Beuth Hochschule Behandler-Klassen, -Objekte und -Methoden WS15/16, S. 1 Behandler-Klassen, -Objekte und -Methoden
Zur Erinnerung:
1. Die Ereignis-Art actionPerformed gehört zur Oberart Aktions-Ereignis.
2. Der Oberart Aktions-Ereignis ist die Schnittstelle ActionListener zugeordnet.
3. Die Schnittstelle ActionListener enthält (nur) eine Methode namens actionPerformed.
Im Programm Grabo30 wird ein JButton-Objekt namens meinKnopf mit der Beschriftung Knopf37 vereinbart. Bei diesem Knopf-Objekt wird ein Behandler-Objekt (namens behandlerOb- jekt) einer Behandler-Klasse (namens BehandlerKlasse) angemeldet. Dieses Behandler-Objekt enthält eine Methode namens actionPerformed. Diese Methode wird jedes mal ausgeführt, wenn der Benutzer auf den Knopf37 klickt. Die Methode gibt dann eine Meldung zur Standardausgabe aus.
Auf dem Bildschirm zeigt das Programm Grabo30 ein kleines Fenster an, welches etwa so aussieht:
Das Programm Grabo30 gibt Meldungen wie die folgenden zur Standardausgabe aus, bis der Benutzer es mit einem Klick auf den Fenster-Schließen-Knopf (den rechts oben mit dem x darin) beendet:
Grabo30: Here we go!
--- --- Grabo30: That's all!
Uhrzeit in Millisekunden: 1.478.881.348.762 Uhrzeit in Millisekunden: 1.478.881.349.978 Uhrzeit in Millisekunden: 1.478.881.350.930 Uhrzeit in Millisekunden: 1.478.881.351.913 Uhrzeit in Millisekunden: 1.478.881.403.284
In diesem Beispiel hat der Benutzer offenbar 5 Mal auf den Knopf37 geklickt, bevor er das Programm Grabo30 wieder beendet hat.
Die folgenden beiden Programme Grabo30 und Grabo31 leisten weitgehend das Gleiche.
Beide melden ein Behandler-Objekt (des Typs ActionListener) bei einem Grabo-Objekt (des Typs JButton) an. Die Anmeldung erfolgt aber auf zwei verschiedene Weisen, einmal "mit Namen" und einmal "ohne Namen".
S. 2, WS15/16 Behandler-Klassen, -Objekte und -Methoden Beuth-Hochschule
1 // Datei Grabo30.java
2 /* --- 3 Ein Grabo30-Objekt ist ein Fenster (JFrame-Objekt) mit einem
4 Knopf (JButton-Objekt) darin. Wenn der Benutzer auf den Knopf klickt, 5 wird zur Standardausgabe ausgegeben, wie viele Millisekunden seit 6 Beginn des Tages 01.01.1970 vergangen sind.
7
8 In dieser Version wird ein Behandler-Objekt (namens behandlerObjekt) 9 einer Behandler-Klasse (namens BehandlerKlasse) bei dem Knopf angmeldet.
10 Siehe auch Grabo31.java.
11 --- */
12 import javax.swing .JFrame;
13 import javax.swing .JButton;
14 import java .awt .event.ActionListener;
15 import java .awt .event.ActionEvent;
16
17 class Grabo30 extends JFrame {
18 // --- 19 private JButton meinKnopf;
20 // --- 21 // Eine Behandler-Klasse (mit Namen) vereinbaren:
22 private static class BehandlerKlasse implements ActionListener { 23 public void actionPerformed(ActionEvent ae) {
24 printf("Uhrzeit in Millisekunden: %,d%n", ae.getWhen());
25 } // actionPerformed 26 } // BehandlerKlasse
27 // --- 28 // Ein Behandler-Objekt (mit Namen) vereinbaren:
29 private BehandlerKlasse behandlerObjekt = new BehandlerKlasse();
30 // --- 31 Grabo30(String ueberSchrift) {
32 super(ueberSchrift);
33 meinKnopf = new JButton("Knopf37");
34 // --- 35 // Jetzt wird das behandlerObjekt beim Knopf meinKnopf angemeldet:
36 meinKnopf.addActionListener(behandlerObjekt);
37 // Danach wird die Methode actionPerformed in diesem Behandler- 38 // Objekt jedesmal ausgefuehrt, wenn der Knopf ein Ereignis der 39 // Art actionPerformed erzeugt.
40 // --- 41 // Den Knopf in das Grabo30-Fenster einfuegen:
42 this.add(meinKnopf, "Center");
43
44 this.setDefaultCloseOperation(Grabo30.EXIT_ON_CLOSE);
45 this.setBounds(400, 200, 300, 100);
46 this.setVisible(true);
47 } // Konstruktor Grabo30
48 // --- 49 static public void main(String[] args) {
50 printf("Grabo30: Here we go!%n");
51 printf("---%n");
52 new Grabo30("Version mit Namen!");
53 printf("---%n");
54 printf("Grabo30: That's all!%n%n");
55 } // main
56 // --- 57 // Eine Methode mit einem kurzen Namen:
58 static void printf(String f, Object... v) {System.out.printf(f, v);}
59 // --- 60 } // class Grabo30
Beuth Hochschule Behandler-Klassen, -Objekte und -Methoden WS15/16, S. 3 In der Klasse Grabo30 wurde für den Knopf eine Behandler-Klasse und ein Behandler-Objekt vereinbart. In einem größeren Grabo-Programm mit zig oder hunderten von Knöpfen, Menüs etc. wäre es sehr lästig, für entsprechend viele Klassen und Objekte Namen zu erfinden. Das Programm
Grabo31 zeigt, wie man ein namenloses (anonymes) Behandler-Objekt einer namenlosen (anonymen) Behandler-Klasse bei einem Knopf anmelden kann:
1 // Datei Grabo31.java
2 /* --- 3 Ein Grabo31-Objekt ist ein Fenster (JFrame-Objekt) mit einem
4 Knopf (JButton-Objekt) darin. Wenn der Benutzer auf den Knopf klickt, 5 wird zur Standardausgabe ausgegeben, wie viele Millisekunden seit 6 Beginn des Tages 01.01.1970 vergangen sind.
7
8 In dieser Version wird ein anonymes Behandler-Objekt 9 einer anonymen Behandler-Klasse bei dem Knopf angmeldet.
10 Siehe auch Grabo30.java.
11 --- */
12 import javax.swing .JFrame;
13 import javax.swing .JButton;
14 import java .awt .event.ActionListener;
15 import java .awt .event.ActionEvent;
16
17 class Grabo31 extends JFrame {
18 // --- 19 private JButton meinKnopf;
20 // --- 21 Grabo31(String ueberSchrift) {
22 super(ueberSchrift);
23 meinKnopf = new JButton("Knopf37");
24 // --- 25 // Ein Behandler-Objekt ohne Namen ("ein anonymes Objekt")
26 // einer Behandler-Klasse ohne Namen ("einer anonymen Klasse") 27 // wird vereinbart und beim Knopf meinKnopf angemeldet.
28 // Danach wird die Methode actionPerformed in diesem Behandler- 29 // Objekt jedesmal ausgefuehrt, wenn der Knopf ein Ereignis der 30 // Art actionPerformed erzeugt.
31
32 meinKnopf.addActionListener(new ActionListener() { 33 @Override
34 public void actionPerformed(ActionEvent ae) {
35 // Das Objekt ae enthaelt Informationen ueber das Ereignis 36 printf("Uhrzeit in Millisekunden: %,d%n", ae.getWhen());
37 } // actionPerformed 38 });
39 // --- 40 // Den Knopf in das Grabo31-Fenster einfuegen:
41 this.add(meinKnopf,"Center");
42
43 this.setDefaultCloseOperation(Grabo31.EXIT_ON_CLOSE);
44 this.setBounds(400, 200, 300, 100);
45 this.setVisible(true);
46 } // Konstruktor Grabo31
47 // --- 48 static public void main(String[] args) {
49 printf("Grabo31: Here we go!%n");
50 printf("---%n");
51 new Grabo31("Version ohne Namen!");
52 printf("---%n");
53 printf("Grabo31: That's all!%n%n");
54 } // main
55 // --- 56 // Eine Methode mit einem kurzen Namen:
S. 4, WS15/16 Behandler-Klassen, -Objekte und -Methoden Beuth-Hochschule
57 static void printf(String f, Object... v) {System.out.printf(f, v);}
58 // --- 59 } // class Grabo31