Java Variable aus Actionlistener in Attribut speichern

cl0udt

Lt. Junior Grade
Registriert
Sep. 2008
Beiträge
508
Hi Leute,

hab grad ein verzwicktes Problem. Is sicher einfach zu lösen, aber komme nicht drauf. Folgenden Code beinhaltet einer meiner Buttons auf meiner GUI:

Code:
public void actionPerformed (ActionEvent e){
					
try {
int x= Integer.parseInt(getJTextFieldX().getText());
}catch (NumberFormatException nfe){
return;
}

Die Variable X wird aus dem entsprechenden Textfeld getJTextFieldX ausgelesen.
Jetzt würde ich diese Variable gerne in ein Attribut meiner Klasse speichern, denn es ist notwendig, das eine andere Klasse auf dieses Attribut zugreift. Das funktioniert leider nicht. Eclipse will nicht, dass die variable außerhalb des Actionlisteners ist....wie bekomm ich das gebacken?

Danke und Gruß
Benny
 
Schreib dir ne private Methode der GUI-Klasse mit nem int als Argument, die dann einfach deiner Instanzvariable diesen Wert zuweist.
zB so
Code:
private void setX(int x) {
    this.x = x;
}
Diese Methode kannst du dann aus deiner actionPerformed()-Methode aus aufrufen.

Edit: Ach ja: NumberFormatExceptions sind Runtime-Exceptions und die sollte man nicht abfangen. Das ist schlechter Stil. Eleganter wäre es, wenn du verhinderst, dass ein Parsing-Fehler überhaupt auftritt ;)

Gruß Timo
 
x vor dem try/catch block erstellen und initialisieren ? Oder hab ich dein Problem nicht verstanden ?
 
[ ] Du hast verstanden, was Namespaces sind.

Dein x existiert nur im Namespace der Funktion actionPerformed und verschwindet deshalb, sobald die Ausführung beendet wurde. Du musst in deiner Klasse ein Feld anlegen - nenn es von mir aus auch x - und den Wert darin speichern.

NumberFormatExceptions sind Runtime-Exceptions und die sollte man nicht abfangen. Das ist schlechter Stil. Eleganter wäre es, wenn du verhinderst, dass ein Parsing-Fehler überhaupt auftritt ;)
Und wie soll er das deiner Meinung nach tun? Vor dem parsen kann er nicht wissen, ob sich im Textfeld eine gültige Zahl befindet. Dazu müsste er sie erst parsen und dann... wir verstehen uns.
 
Zuletzt bearbeitet:
Alternativ könnte man auch einen setter nehmen um die Variable zu speichern. Anschliessend mit dem getter aufrufen. Zwar unschön, aber es würde auch laufen :)

@riDDi Klasse erste Zeile! :D
 
Er könnte den String ausm Textfeld zum Beispiel mit einem regulären Ausdruck (zB diesem hier: "[-]?[0-9]+") vergleichen und nur parsen, wenn es einen Treffer gibt.
Code:
if (getJTextFieldX().getText().matches("[-]?[0-9]+")) {
    x= Integer.parseInt(getJTextFieldX().getText());
}

Gruß Timo
 
Hi,

deklariere deine x-Variable als private und ausserhalb deiner actionPerformed-Methode (also int x;). Schreib die die getter und setter-Methode für den Zugriff - auch von ausserhalb - auf diese Variable. In deiner actionPerformed-Methode brauchste nur noch die setter-Methode um dem x einen wert zuzuweisen.

Gruß
 
@yoT!mO: Keine gute Idee. Ohne den Code genau zu analysieren kannst du nicht sicher sein, welche Strings parseInt nicht verarbeiten kann. Selbst dann kann es noch je nach Library-Version Unterschiede geben. Die Exceptions abzufangen ist sicherer und effizienter.
 
Danke für die Hilfe Leute.
Hab mich für den setter entschieden. Klappt super!
 
riDDi schrieb:
Namespaces sind auch Scopes.
Schon, aber ein Scope ist eben nicht automatisch auch ein Namespace. ;)

Man kann Funktionen und Klasse theoretisch durchaus als "implizite Namepaces" ansehen, allerdings ist das, zumindest in meiner Praxis, eher ungebräuchlich. Das führt auch zu lästigen Mehrdeutigkeiten, da dann nicht immer klar ist ob nun ein "normaler" (Java-)Namespace gemeint ist oder eben der Scope einer Methode oder Funktion.
 
Zurück
Oben