Zum Inhalt springen

Unklarheit: Java und ActionListener


kurtchen

Empfohlene Beiträge

Hallo liebe Forumsteilnehmer,

nachdem ich bei meinem letzten Problem so gute Erklärungen bekommen habe, möchte ich mich mal wieder an euch wenden. Mein Java-Kurs schreitet voran. Inzwischen beschäftige ich mich mit GUIs (erst mal mit Swing, nicht mit JavaFX).

Bislang habe ich einen ActionListener z.B. bei einem JTextField so registriert:

startButton = new JButton("Start");

startButton.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent ae) {

startGedrueckt();

}

});

Sprich, ich habe den ActionListener als anonyme innere Klasse angemeldet, die actionPerformed implementiert.

Nun hatte ich eine Übung, bei der mehrere Komponenten ihre ActionEvents an den gleichen ActionListener schicken sollen, also z.B. ein JTextField und ein JButton.

Darum hatte ich die Idee, den ActionListener nicht anonym zu verwenden, sondern ihn zu benennen.

So habe ich ihn benannt:

ActionListener encodeListener = new ActionListener() {

public void actionPerformed( ActionEvent ae ) {

jtfCiphertext.setText(encode(jtfPlaintext.getText()));

jtfPlaintext.setText("");

}

};

Und so habe ich ihn angemeldet:

jtfPlaintext.addActionListener(encodeListener);

encodeButton.addActionListener(encodeListener);

Das funktioniert auch. Hier wird die Variable encodeListener in einem Schritt deklariert und etwas zugewiesen. Nun wollte ich diese beiden Schritte trennen. Also:

ActionListener encodeListener; // Deklaration

encodeListener = new ActionListener() {

public void actionPerformed( ActionEvent ae ) {

jtfCiphertext.setText(encode(jtfPlaintext.getText()));

jtfPlaintext.setText("");

}

}; // Zuweisung

Und interessanterweise funktioniert es so nicht mehr. Der Compiler beschwert sich bei der Zuweisung encodeListener = ... mit der Meldung "Identifier expected".

Kann mir jemand erklären, warum das so ist?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Anzeige: (wird für registrierte Benutzer ausgeblendet)

Wo steht denn Dein Code? Wenn der Code nämlich in einer Methode steht, geht es (gerade ausprobiert). Nicht gehen tut es, wenn der Code im Deklartionsblock (also direkt in der Klasse steht). Da kann man keine Zuweisungen außerhalb der Deklaration machen. Das hat mit ActionListenern nichts zu tun:

class X{

int i=5;

}

geht.

class Y{

int i;

i=5;

}

geht nicht.

class Y{

void y(){

int i;

i=5;

}

}

geht wiederum. Löst das das Rätsel?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo stefhk3,

es löst das Rätsel. Anscheinend sind mir die Spielregeln noch nicht klar, wann und wo ich deklarieren und zuweisen in einem Schritt erledigen muss und wo ich es getrennt erledigen muss oder darf. Aber dann ich weiß wenigstens, dass es nichts speziell mit ActionListenern zu tun hat sondern ich Verständnis in einer anderen Richtung suchen muss.

Bis jetzt kenne ich jedenfalls 3 Arten einen ActionListener zu realisieren:

1. Die Klasse, in der ich das GUI baue, implementiert eine Methode actionPerformed. Die ganze Klasse ist sozusagen der ActionListener.

2. Ich definiere eine innere Klasse, die die Methode actionPerformed implementiert. Dann übergebe ich eine Instanz dieser Klasse an die entsprechende Komponente.

3. Ich übergebe eine anonyme innere Klasse.

GUIs scheinen ein weites Feld zu sein, aber es macht auch Spaß, nicht mehr nur auf der Console rumzukriechen. Ich arbeite zur Zeit mit dem Buch "Swing - A Beginner's Guide" von Herbert Schildt. Es geht bislang ziemlich langsam vor und jede Neue Komponente wird mir mehreren kleinen Beispielprogrammen vorgestellt. Die Variationen sind oft klein, so dass sich von Beispiel zu Beispiel vieles wiederholt. Didaktisch finde ich das ganz geschickt, weil ich beim eintippen der zweiten oder dritten Variation merke, dass ich mir schon vieles gemerkt habe und eigentlich auch ohne Blick ins Buch weiß, wie es wohl weitergehen wird. Und wenn dann ein Kapitel durch ist, merke ich auch, dass ich mit dem Material rumspielen kann, mir eigene kleine Herausforderungen ausdenken kann und auch tatsächlich eine Chance habe, das dann umzusetzen.

Viele Grüße

Kurtchen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eine kleine unqualifizierte Aussage von mir als Java-Unwissende: Meine Java-Kollegen raten alle davon ab GUI in Java mit Swing zu lernen. Man solle doch gleich JavaFX verwenden. Du hast ja eingangs auch erwähnt, dass du noch nicht JavaFX nimmst. Hat das einen bestimmten Grund?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo kawoosh,

ja, es hat Gründe, dass ich erst mal mit Swing lerne.

Ich lerne mit Java nach langer, langer Pause wieder eine Programmiersprache. Und in eigentlich allen einführenden Büchern wird das Thema GUI noch mit Swing abgehandelt. Darum lag es nahe, damit anzufangen.

Ich habe auch schon Bücher über JavaFX angeschaut. Die waren aber anscheinend in der Annahme geschrieben, dass man schon Erfahrung mit GUI-Programmierung hat, z.B. mit Swing.

Der für mich wichtigste Punkt: Ich lerne Java, weil ich ab Herbst gerne ein Fernstudium beginnen würde. Und bislang ist der Studienplan so, dass Java als einführende Programmiersprache gelehrt wird. Und die Einführung in die GUI-Programmierung geht noch immer mit Swing. Ich hatte vorher Gelegenheit, mich mit einem Studenten auszutauschen, der schon ein paar Semester dabei ist. Der hat mir erzählt, dass er vor allem mit den objektorientierten Konzepten und mit dem Thema GUI-Programmierung zu kämpfen hatte. (Mathe war auch eine anfängliche Hürde.) Daher kam mir die Idee, mich in dieses Thema schon ein bisschen einzuarbeiten.

Ich hab große Lust, was neues zu lernen. Aber ich habe auch ein bisschen Bammel davor, weil es schon eine Weile her ist, dass ich zum Beispiel Prüfungen bestehen musste. Dass ich jetzt schon mal auf eigene Faust mit Java experimentiere und lerne, dient auch dazu, dass ich ein Gefühl dafür bekomme, ob ich mir ein Studium zutraue und ob mir das auch Spaß machen könnte. Bislang macht es mir viel Spaß, Java zu lernen. Und mein Zutrauen wächst auch.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.




×
  • Neu erstellen...