ein beispiel in java. import javax.swing.*; // gui komponente import java.awt.*; // layouts import...

34
Ein Beispiel in Java

Upload: carlene-gens

Post on 05-Apr-2015

115 views

Category:

Documents


2 download

TRANSCRIPT

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

Ein Beispiel in Java

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

import javax.swing.*; // GUI Komponenteimport java.awt.*; // Layoutsimport 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

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

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

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

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

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

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.

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

Was haben wir bis jetzt gemacht (anschaulich beschrieben)?

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

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

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

myfObj

myw

Wanze an den Button nageln

void actionPerformed (ActionEvent ae){ ...}

myb

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

myfObj

myw

ActionEventObjekt

Mausklick erzeugt (von der JVM) ein ActionEvent Objekt, das der

aufgerufenen Methode actionPerformed(...) übergeben wird

void actionPerformed (ActionEvent ae){ ...}

myb

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

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

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

myfObj

myw

Die Methode actionPerformed(...) muss beim Mausklick die

Hintergrundfarbe auf blau setzen.ActionEvent

Objekt

void actionPerformed (ActionEvent ae){ ...}

myb

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

myfObj

myw

Die Methode actionPerformed(...) muss beim Mausklick die

Hintergrundfarbe auf blau setzen.ActionEvent

Objekt

void actionPerformed (ActionEvent ae){ ...}

myb

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

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

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

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

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

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

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

myfObj

myw

void actionPerformed (ActionEvent ae){ ...}

private MyFenster myf;

Man muss myw noch einen Verweis (Pointer) auf myfObj spendieren (als Attribut = Datenmember).

myb

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

myfObj

myw

void actionPerformed (ActionEvent ae){ ...}

private MyFenster myf;

Welche Anweisung realisiert in welcher Methode diesen Verweis?

myb

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

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

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

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

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

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

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

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

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

Ein Problem gibt es noch:

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

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

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

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?

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

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!

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

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.

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

Implementierung dieses Beispiels:

(Veränderungen zum letzten Programm MainListener1, das nicht die

Hintergrundfarbe ändert, werden blau angezeigt)

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

import javax.swing.*; // GUI Komponenteimport java.awt.*; // Layoutsimport 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

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

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.

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

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.

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

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.

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

Während des Programmablaufs passiert also folgendes:

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

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 !

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

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.