Hallo zusammen,
ich hatte mir schon so etwas gedacht ... und das verwirrt mich nun noch mehr.
Es geht um folgende Aufgabe in meinem Kurs:
Code:
import java.awt.*;
import java.awt.event.*;
class Fenster extends Frame implements ActionListener {
boolean state = false;
Fenster() {
setSize(300,100);
setLocation(100,100);
Button b = new Button("Kick me!");
b.addActionListener(this);
addWindowListener (new WindowAdapter() {
public void windowClosing(WindowEvent ev) {
System.exit(0);
}
});
add(b,BorderLayout.CENTER);
actionPerformed(null);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if(!state)
setTitle("Da staunt ihr ...");
else
setTitle("... nicht schlecht.");
state = !state;
}
public static void main(String[] args) {
new Fenster();
System.out.println("Also ich bin hier jetzt fertig.");
}
}
Wenn ich das richrig verstanden habe, sollte der Aufruf actionPerformed(null) nichts bewirken.
Wenn ich das Programm aber starte und den Button drücke, bewrikt die Prozedur actionPerformed doch das Wechseln des Fenster-Titels.
Warum ist das so ?
Vielleicht kann mir hier jemand einen Tip geben.
Natürlich bewirkt der Aufruf was. Die Methode wird ausgeführt. Du hast lediglich kein ActionEvent sondern null als Parameter übergeben. Da du den Parameter nicht in deiner Methode verwendest, ist es theoretisch egal was der Methode übergeben wird - es kommt immer auf´s gleiche raus.
Ich würde das zumindest als SEHR schlechten Stil bezeichnen: ActionPerformed wird von der Component aufgerufen, die einen ActionEvent erzeugt hat und dieser ActionEvent wird der actionPerformed übergeben. Punkt.
In diesem Programm wird es mißbraucht, um den "Anfangs-Titel" zu setzen. Was "besser" wäre, hängt vom jeweiligen Fall ab. Hier könnte man statt des
actionPerformed(null);
auch einfach 'state' auf 'true' setzen und schreiben
setTitle("Da staunt ihr ...");
Das wäre auch nicht schön (abgesehen davon, dass "state" ein herrlich nichtssagender Variablenname ist...). Eine "schönere" Lösung wäre zumindest sowas wie
Code:
import java.awt.*;
import java.awt.event.*;
class Fenster extends Frame implements ActionListener {
boolean state = false;
Fenster() {
....
toggleTitle();
setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
toggleTitle();
}
public void toggleTitle() {
if(!state)
setTitle("Da staunt ihr ...");
else
setTitle("... nicht schlecht.");
state = !state;
}
}
aber wie man das genau macht, muss man von Fall zu Fall entscheiden.