Upload
carlene-gens
View
126
Download
2
Embed Size (px)
Citation preview
Ein Beispiel in Java
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
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
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
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.
Was haben wir bis jetzt gemacht (anschaulich beschrieben)?
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
myfObj
myw
Wanze an den Button nageln
void actionPerformed (ActionEvent ae){ ...}
myb
myfObj
myw
ActionEventObjekt
Mausklick erzeugt (von der JVM) ein ActionEvent Objekt, das der
aufgerufenen Methode actionPerformed(...) übergeben wird
void actionPerformed (ActionEvent ae){ ...}
myb
Wie kann man durch einen Mausklick auf den Button (oder irgend ein anderes grafisches Element des Fensters) die Hintergrundfarbe des Buttons blau machen?
myfObj
myw
Die Methode actionPerformed(...) muss beim Mausklick die
Hintergrundfarbe auf blau setzen.ActionEvent
Objekt
void actionPerformed (ActionEvent ae){ ...}
myb
myfObj
myw
Die Methode actionPerformed(...) muss beim Mausklick die
Hintergrundfarbe auf blau setzen.ActionEvent
Objekt
void actionPerformed (ActionEvent ae){ ...}
myb
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
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
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
myfObj
myw
void actionPerformed (ActionEvent ae){ ...}
private MyFenster myf;
Man muss myw noch einen Verweis (Pointer) auf myfObj spendieren (als Attribut = Datenmember).
myb
myfObj
myw
void actionPerformed (ActionEvent ae){ ...}
private MyFenster myf;
Welche Anweisung realisiert in welcher Methode diesen Verweis?
myb
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
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
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
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
Ein Problem gibt es noch:
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
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?
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!
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.
Implementierung dieses Beispiels:
(Veränderungen zum letzten Programm MainListener1, das nicht die
Hintergrundfarbe ändert, werden blau angezeigt)
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
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.
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.
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.
Während des Programmablaufs passiert also folgendes:
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 !
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.