Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Ein Beispiel in Java.

Ähnliche Präsentationen


Präsentation zum Thema: "Ein Beispiel in Java."—  Präsentation transkript:

1 Ein Beispiel in Java

2 import javax.swing.*; // GUI Komponente
import java.awt.*; // Layouts import java.awt.event.*; // Ereignisse public class MainListener1 { public static void main(String[] args) { MyFenster myfObj = new MyFenster(); myfObj.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); } Hier wird ein Objekt, also myfObj, der selbstgebastelten Klasse MyFenster erzeugt, d.h. auf den Bildschirm gebracht Programm wird beendet (aus dem Arbeitsspeicher entfernt), wenn Fenster weggeklickt wird. Nachprüfen mit Task-Manager

3 class MyFenster extends JFrame { private Container mycont;
private JPanel mypan; private JButton myb; private MyWanze myw; public MyFenster() { mycont = getContentPane(); mypan = new JPanel(); myb = new JButton("Bitte klick hier drauf"); myw = new MyWanze(); // weiter mit nächster Folie Variablen (Objekte) deklarieren Speicher für die eben deklarierten Variablen reservieren

4 myb.addActionListener(myw);
mypan.add(myb); mycont.add(mypan); setTitle("Ein Klick-Test"); setLocation(100,200); setSize(400,200); setVisible(true); } Eine Wanze an das Button myb anbringen Den Button myb an das Panel mypan montieren Das Panel mypan an das Objekt mycont montieren

5 class MyWanze implements ActionListener {
public MyWanze(){ } public void actionPerformed (ActionEvent ae) { System.out.println("Ich wurde angeklickt"); Das zum Ereignis (z.B. Mausklick) erzeugte Ereignis-Objekt wird der passenden Methode übergeben und kann dort verwendet werden Hier wird das Ereignis-Objekt ae nicht verwendet. Doch könnten die sich in ae befindlichen Informationen (z.B. Koordinaten der Maus) in dieser Methode verwendet werden.

6 Was haben wir bis jetzt gemacht (anschaulich beschrieben)?

7 Anlegen des Objekts myfObj
Anlegen des Objekts myb (Button) innerhalb von myfObj Anlegen des Objekts myw innerhalb von myfObj myfObj myb myw void actionPerformed (ActionEvent ae){ ... }

8 Wanze an den Button nageln
myfObj myb myw void actionPerformed (ActionEvent ae){ ... }

9 Mausklick erzeugt (von der JVM) ein ActionEvent Objekt, das der aufgerufenen Methode actionPerformed(...) übergeben wird ActionEvent Objekt myfObj myb myw void actionPerformed (ActionEvent ae){ ... }

10 Wie kann man durch einen Mausklick auf den Button (oder irgend ein anderes grafisches Element des Fensters) die Hintergrundfarbe des Buttons blau machen?

11 Die Methode actionPerformed(
Die Methode actionPerformed(...) muss beim Mausklick die Hintergrundfarbe auf blau setzen. ActionEvent Objekt myfObj myb myw void actionPerformed (ActionEvent ae){ ... }

12 Die Methode actionPerformed(
Die Methode actionPerformed(...) muss beim Mausklick die Hintergrundfarbe auf blau setzen. ActionEvent Objekt myfObj myb myw void actionPerformed (ActionEvent ae){ ... }

13 Ein Button hat zwar die Methode setBackground(. ), mit der man z. B
Ein Button hat zwar die Methode setBackground(...), mit der man z.B. die Farbe blau setzen kann: setBackground(Color.blue). Welches Problem gibt es, wenn man dies innerhalb von actionPerformed(...) machen will? myf myb myw void actionPerformed (ActionEvent ae){ ... }

14 Die Methode actionPerformed(
Die Methode actionPerformed(...) befindet sich innerhalb des Objekts myw und kann deshalb nicht auf das außerhalb liegende Objekt myb zugreifen. myfObj myb myw void actionPerformed (ActionEvent ae){ ... }

15 Was kann man machen um innerhalb von myw auf myb (besser noch auf das ganze Fenster myfObj) zugreifen zu können? myfObj myb myw void actionPerformed (ActionEvent ae){ ... }

16 Man muss myw noch einen Verweis (Pointer) auf myfObj spendieren (als Attribut = Datenmember).
myb myw private MyFenster myf; void actionPerformed (ActionEvent ae){ ... }

17 Welche Anweisung realisiert in welcher Methode diesen Verweis?
myfObj myb myw private MyFenster myf; void actionPerformed (ActionEvent ae){ ... }

18 Beim Anlegen des Objekts myw, also im Konstruktor von MyWanze, bekommt dieser Konstruktor als Parameter myfObj übergeben. myfObj myb myw private MyFenster myf; public MyWanze(MyFenster f){ myf = f; } void actionPerformed (ActionEvent ae){ ... }

19 Jetzt endlich kann man in der Methode actionPerformed in aller Ruhe über myf auf myfObj zugreifen!
myb myw private MyFenster myf; public MyWanze(MyFenster f){ myf = f; } void actionPerformed (ActionEvent ae){ myf.myb.setBackground(Color.blue); }

20 myf.myb.setBackground(Color.blue);
Warum befindet sich noch ein Fehler in der folgenden Anweisung? myf.myb.setBackground(Color.blue); myfObj myb myw private MyFenster myf; public MyWanze(MyFenster f){ myf = f; } void actionPerformed (ActionEvent ae){ myf.myb.setBackground(Color.blue); }

21 Da myb in MyFenster private ist, funktioniert natürlich myf. myb nicht
Da myb in MyFenster private ist, funktioniert natürlich myf.myb nicht. Dies wurde hier nur aus didaktischen Gründen gemacht. Deshalb muss hier natürlich eine get-Methode benutzt werden. myfObj myb myw private MyFenster myf; public MyWanze(MyFenster f){ myf = f; } void actionPerformed (ActionEvent ae){ myf.myb.setBackground(Color.blue); }

22 Ein Problem gibt es noch:

23 Erzeugen des Objekts myfObj ...
Wie kann das Objekt myfObj dem Konstruktor von MyWanze sich selbst als Parameter übergeben? ... nach diesem Bauplan Erzeugen des Objekts myfObj ... MyFenster myfObj = new MyFenster(); class MyFenster extends JFrame { ... private MyWanze myw; public MyFenster() { myb = new JButton("Bitte klicke mich"); myw = new MyWanze( ); }

24 Warum funktioniert das nicht?
MyFenster myfObj = new MyFenster(); class MyFenster extends JFrame { ... private MyWanze myw; public MyFenster() { myb = new JButton("Bitte klicke mich"); myw = new MyWanze(myfObj); }

25 Weil im Bauplan nicht schon der Name des Objekts stehen kann, das irgendein Programmierer später (nach der Erstellung) des Bauplans) dem Objekt beim Anlegen mit new .. vergibt! MyFenster myfObj = new MyFenster(); class MyFenster extends JFrame { ... private MyWanze myw; public MyFenster() { myb = new JButton("Bitte klicke mich"); myw = new MyWanze(myfObj); }

26 Der Zugriff innerhalb einer Methode eines Objekts auf das Objekt selbst geschieht mit dem Bezeichner this. In dem Fall hier wird mit this das Objekt myfObj an den Parameter desKonstrutors von myWanze übergeben. MyFenster myfObj = new MyFenster(); class MyFenster extends JFrame { ... private MyWanze myw; public MyFenster() { myb = new JButton("Bitte klicke mich"); myw = new MyWanze(this); }

27 Implementierung dieses Beispiels:
(Veränderungen zum letzten Programm MainListener1, das nicht die Hintergrundfarbe ändert, werden blau angezeigt)

28 import javax.swing.*; // GUI Komponente
import java.awt.*; // Layouts import java.awt.event.*; // Ereignisse public class MainListener2 { public static void main(String[] args) { MyFenster myfObj = new MyFenster(); myf.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); } Hier wird ein Objekt, also myf, der selbstgebastelten Klasse MyFenster erzeugt, d.h. auf den Bildschirm gebracht Programm wird beendet (aus dem Arbeitsspeicher entfernt), wenn Fenster weggeklickt wird. Nachprüfen mit Task-Manager

29 Variablen (Objekte) deklarieren
class MyFenster extends JFrame { private Container mycont; private JPanel mypan; private JButton myb; private MyWanze myw; public MyFenster() { mycont = getContentPane(); mypan = new JPanel(); myb = new JButton("Bitte klicke mich"); myw = new MyWanze(this); Variablen (Objekte) deklarieren Speicher für die eben deklarierten Variablen reservieren mit this wird das durch den Aufruf des Konstruktors MyFenster soeben erzeugte Objekt der Klasse MyFenster bezeichnet.

30 myb.addActionListener(myw);
mypan.add(myb); mycont.add(mypan); setTitle("Ein Klick-Test"); setLocation(200,200); setSize(400,200); setVisible(true); } public JButton getMyb(){ return(myb); Eine Wanze an das Button myb anbringen Den Button myb an das Panel mypan montieren Das Panel mypan an das Fenster MyFenster montieren Liefert das Objekt myb zurück.

31 class MyWanze implements ActionListener {
private MyFenster myf; public MyWanze(MyFenster f){ myf = f; } public void actionPerformed (ActionEvent ae){ myf.getMyb().setBackground(Color.blue); System.out.println("Ich wurde angeklickt"); Setzt die Hintergrundfarbe des Buttons myb auf blau. In dieser Methode muss auf den Button myb der Klasse MyFenster zugegriffen werden. Innerhalb der Klasse MyWanze geht das nur, wenn sich dieses Objekt als Attribut in der Klasse MyWanze befindet.

32 Während des Programmablaufs passiert also folgendes:

33 MyFenster myfObj = new MyFenster();
Das Objekt myfObj wird erzeugt und dabei der Konstruktor MyFenster() aufgerufen. myw = new MyWanze(this); MyWanze(myfObj) Innerhalb dieses Konstruktors MyFenster wird der Konstruktor MyWanze(this) aufgerufen. myf = myfObj; this ist das Objekt myfObj Im Konstruktor MyWanze wird die Anweisung ausgeführt. myfObj.getMyb().setBackground(Color.blue); damit wird also auf das Button myb im oben erzeugten Fenster myfObj zugegriffen !

34 Aufgabe: Verändern Sie das Programm so, dass sich bei jedem Klick auf das Button die Hintergrundfarbe von blau auf rot bzw. von rot auf blau ändert.


Herunterladen ppt "Ein Beispiel in Java."

Ähnliche Präsentationen


Google-Anzeigen