Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Ein Beispiel in Java. import javax.swing.*; // GUI Komponente import java.awt.*; // Layouts import java.awt.event.*; // Ereignisse public class MainListener1.

Ähnliche Präsentationen


Präsentation zum Thema: "Ein Beispiel in Java. import javax.swing.*; // GUI Komponente import java.awt.*; // Layouts import java.awt.event.*; // Ereignisse public class MainListener1."—  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); } Den Button myb an das Panel mypan montieren Das Panel mypan an das Objekt mycont montieren Eine Wanze an das Button myb anbringen

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 myfObj myw Anlegen des Objekts myfObj Anlegen des Objekts myw innerhalb von myfObj void actionPerformed (ActionEvent ae){... } myb Anlegen des Objekts myb (Button) innerhalb von myfObj

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

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

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 myfObj myw Die Methode actionPerformed(...) muss beim Mausklick die Hintergrundfarbe auf blau setzen. ActionEvent Objekt void actionPerformed (ActionEvent ae){... } myb

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

13 myf myw 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? void actionPerformed (ActionEvent ae){... } myb

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

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

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

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

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

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

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

21 myfObj myw void actionPerformed (ActionEvent ae){ } private MyFenster myf; 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. public MyWanze(MyFenster f){ myf = f; } myf.myb.setBackground(Color.blue); myb

22 Ein Problem gibt es noch:

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

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

25 MyFenster myfObj = new MyFenster(); class MyFenster extends JFrame {... private MyWanze myw; public MyFenster() {... myb = new JButton("Bitte klicke mich"); myw = new MyWanze(myfObj);... } 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!

26 MyFenster myfObj = new MyFenster(); class MyFenster extends JFrame {... private MyWanze myw; public MyFenster() {... myb = new JButton("Bitte klicke mich"); myw = new MyWanze(this);... } 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.

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 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); } Den Button myb an das Panel mypan montieren Das Panel mypan an das Fenster MyFenster montieren Eine Wanze an das Button myb anbringen 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. Innerhalb dieses Konstruktors MyFenster wird der Konstruktor MyWanze(this) aufgerufen. myw = new MyWanze(this); MyWanze(myfObj) this ist das Objekt myfObj Im Konstruktor MyWanze wird die Anweisung ausgeführt. myf = myfObj; 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. import javax.swing.*; // GUI Komponente import java.awt.*; // Layouts import java.awt.event.*; // Ereignisse public class MainListener1."

Ähnliche Präsentationen


Google-Anzeigen