340 likes | 466 Views
Ein Beispiel in Java. 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(
E N D
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
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); } } Eine Wanze an das Button myb anbringen Den Button myb an das Panel mypan montieren Das Panel mypan an das Objekt mycont montieren
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.
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){ ... }
Wanze an den Button nageln myfObj myb myw void actionPerformed (ActionEvent ae){ ... }
ActionEvent Objekt Mausklick erzeugt (von der JVM) ein ActionEvent Objekt, das der aufgerufenen Methode actionPerformed(...) übergeben wird myfObj myb myw void actionPerformed (ActionEvent ae){ ... }
Wie kann man durch einen Mausklick auf den Button (oder irgend ein anderes grafisches Element des Fensters) die Hintergrundfarbe des Buttons blau machen?
ActionEvent Objekt Die Methode actionPerformed(...) muss beim Mausklick die Hintergrundfarbe auf blau setzen. myfObj myb myw void actionPerformed (ActionEvent ae){ ... }
ActionEvent Objekt Die Methode actionPerformed(...) muss beim Mausklick die Hintergrundfarbe auf blau setzen. myfObj myb myw void actionPerformed (ActionEvent ae){ ... }
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){ ... }
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){ ... }
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){ ... }
Man muss myw noch einen Verweis (Pointer) auf myfObj spendieren (als Attribut = Datenmember). myfObj myb myw private MyFenster myf; void actionPerformed (ActionEvent ae){ ... }
Welche Anweisung realisiert in welcher Methode diesen Verweis? myfObj myb myw private MyFenster myf; void actionPerformed (ActionEvent ae){ ... }
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){ ... }
Jetzt endlich kann man in der Methode actionPerformed in aller Ruhe über myf auf myfObj zugreifen! myfObj myb myw private MyFenster myf; public MyWanze(MyFenster f){ myf = f;} void actionPerformed (ActionEvent ae){ 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); }
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); }
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( ); ... } }
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(myfObj); ... } }
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); ... } }
Implementierung dieses Beispiels: (Veränderungen zum letzten Programm MainListener1, das nicht die Hintergrundfarbe ändert, werden blau angezeigt)
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
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); } } 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.
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.
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 !
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.