Texte einlesen mittels Ereignisbehandlung (awt)

Hallo!

Ich sitze gerade vor einer Programmieraufgabe und habe da ein Problem.
Es soll ein Programm erstellt werden, in dem ein eingegebener String in Buchstaben, Zahlen und sonstige Zeichen zerlegt wird.
Bisher habe ich folgenden Quellcode geschrieben:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Aufgabe4 extends Frame
{
//Objekte
TextField EingabeText,BuchstabeAusgabe,ZahlenAusgabe,SonstigeAusgabe;
Label EingabeLabel,Buchstaben,Zahlen,Sonstiges;
Button Ja,Nein;
//Variablen
String text;

public Aufgabe4() //Konstructor
{
setTitle(„Aufgabe 4“);
//Window Listener
addWindowListener(new WindowAdapter()
{public void windowClosing(WindowEvent e)
{System.exit(0);}
});
//Layout festlegen
setLayout( new GridLayout(10,1,10,10));
Label EingabeLabel = new Label(„Eingabe des Strings“);
add(EingabeLabel);
TextField EingabeText = new TextField();
add(EingabeText);
Label Buchstaben = new Label(„Ausgabe der Buchstaben“);
add(Buchstaben);
TextField BuchstabenAusgabe = new TextField();
add(BuchstabenAusgabe);
Label Zahlen = new Label(„Ausgabe der Zahlen“);
add(Zahlen);
TextField ZahlenAusgabe = new TextField();
add(ZahlenAusgabe);
Label Sonstiges = new Label („Sonstige Zeichen“);
add(Sonstiges);
TextField SonstigeAusgabe = new TextField();
add(SonstigeAusgabe);
Label Weiter = new Label(„Weitere Eingabe?“);
add(Weiter);
Button Ja = new Button(„JA“);
add(Ja);
Label Leerfeld = new Label();
add(Leerfeld);
Button Nein = new Button(„Nein/Programmende“);
add(Nein);
setSize(500,300);
setVisible(true);

// Aktionen festlegen
// 1. Texteingabe
EingabeText.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
text = EingabeText.getText();
}
});
// 2. Programmende
Nein.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
});
//3. Nochmalige Umwandlung
Ja.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
Aufgabe4 neu = new Aufgabe4();
}
});

}

public static void main (String[] args)
{
Aufgabe4 neu = new Aufgabe4();

}
}

Die Ereignisbehandlungen zum Programmbeenden und dem nochmaligen Aufruf funktionieren.
Ein Problem habe ich nur bei der Übergabe des Eingabefeldes in die Stringvariable. Laut meinem Lehrbuch („Java-Startup“, Data Becker) sollte das so gehen. Ich krieg da folgende Fehlermeldung von meinem Compiler: C:\Javawork\aufgabe4\aufgabe4.java:57: local variable EingabeText is accessed from within inner class; needs to be declared final
text = EingabeText.getText();
Kann mir jemand sagen, was ich hier falsch mache???
Vielen Dank im voraus für jede Antwort!

Christoph

Hallo,

die Fehlermeldung hat schon klar darauf hingewissen, wo der Fehler liegt. Du hast versucht, in einer locale inner-class (hier der Actionlistener)
EingabeText.addActionListener(new ActionListener()

{
public void actionPerformed(ActionEvent e)
{
text = EingabeText.getText();
}
});

auf den nicht-finalen Variabel EingabeText zuzugreifen. Du könnetest „text = EingabeText.getText“ in eine methode auslagen, dann wird es funktionieren:

public void actionPerformed(ActionEvent e)
{
getText();
}

void getText()
{
text = EingabeText.getText();
}

Übrigens, an deiner Stelle würde ich den ActionListener in dieses Class implimentieren als für jeden Button ein Anonymous-class zu erstellen.

Gruß Tom

Vielen Dank für Deine Hilfe! Ich schau mir die Grundsätze der OOP noch einmal genau an, da habe ich wohl noch nicht alles richtig verstanden.
Christoph

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

bin deinen Code nochmal genauer durchgegangen, der Fehler liegt hier:

EingabeText,BuchstabeAusgabe,ZahlenAusgabe,SonstigeAusgabe;

und

TextField EingabeText = new TextField();

Du hast sozusagen EingabeText nochmal im Konstruktur defeniert, somit wird er ein Local-Varibel, daher kann der Actionlistener nicht auf ihn zugreifen.
Lösung:

  1. TextField in Konstruktur entfernen.
    => EingabeText = new TextField();
    oder
  2. EingabeText im Konstruktur als final defenieren.
    => final TextField EingabeText = new TextField();