Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich hab das Problem, das ich mir eine Klasse geschrieben habe, welche von einer anderen Klasse aufgerufen wird. Die Aufrufende Klasse funktioniert einwandfrei, doch die Klasse an der ich gerade am Schreiben bin will aus irgendeinem Grund alle Variablen als static haben. Um folgende Klasse handelt es sich:
Java:
public class ballMovement {
public static void move(JLabel ball, boolean gameOver) {
Timer t = new Timer(1000, new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (gameOver == false) {
ball.setLocation(ball.getX()-10, ball.getY());
}
t.start();
}
});
}
}
Es geht um die Variablen ball, gameOver und t. Das Programm sagt mir immer Cannot refer to a non-final variable ball inside an inner class defined in a different method. Das Problem ist, wenn ich sie static mache, können Sie nicht mehr verändert werden. Jemand ne Idee wie ich das Problem ausheble? Ich weiß noch das da irgendwas mal war, nur kann ich mich nicht mehr dran erinnern und mein Klassenlehrer ist leider krank, so das ich ihn auch nicht fragen kann.
Du musst die Variablen final machen weil du in einer anonymen Klasse draufzugreifen willst. Es könnte ja vorkommen dass sich die Variablen im späteren Programmverlauf ändern, und das würde der Timer ja nicht mitbekommen.
Das Problem ist, wenn ich sie static mache, können Sie nicht mehr verändert werden.
Ich will jetzt keinen neuen Thread aufmachen, da es eigendlich ein ähnliches Problem ist. Und zwar kann mein ActionListener scheinbar keine Globalen Klassenvariablen benutzen. Ich habe ne Globale Klassenvariable vom Typ char und wenn ich diese in meinem Actionlistener benutzen will, bekomme ich immer die Fehlermeldung: "lastPosition cannot be resolved or is not a field". Das Problem ist, das ich die Variable außerhalb des ActionListeners auch benutze und an den ActionListener kann ich sie ja auch nicht übergeben.
Jemand ne Ahnung was ich machen muss?
Hier der Quellcode:
Java:
public class ballMovement {
char lastPosition = 'u';
public static void move(final JLabel ball, final boolean gameOver) {
Timer t = new Timer(35, new ActionListener() {
public void actionPerformed(ActionEvent e) {
switch (this.lastPosition) {
case 'u':
ball.setLocation(ball.getX(), ball.getY()-5);
break;
case 'd':
ball.setLocation(ball.getX(), ball.getY()+5);
break;
case 'l':
ball.setLocation(ball.getX()-5, ball.getY());
break;
case 'r':
ball.setLocation(ball.getX()+5, ball.getY());
break;
default:
break;
}
}
});
t.start();
}
}
Mal was generelles:
Klassennamen schreibt man UpperCamelCase => BallMovement
dann würde ich mir an deiner Stelle auch das final vor den Parametern angewöhnen (oder die IDE so Einstellen, dass diese es im Notfall übernimmt). Parameter einer Methode sollte man nicht verändern.
> dann würde ich mir an deiner Stelle auch das final vor den Parametern angewöhnen
mit solchen Tipps wäre ich wiederum etwas vorsichtiger,
mag ja ganz schön sein, ist aber nicht zu erzwingen solange 99% aller Internet-Beispiele oder Foren-Threads hier nicht so aussehen,
die Welt beginnt schließlich auch mit
[c]public static void main(String[] args)[/c]
und nicht mit
[c]public static void main(final String[] args)[/c]
für die Klassenschreibweise trifft allerdings die 99%-Regel zu
Nicht meine Welt. Eclipse ist bei mir so eingestellt, dass alle parameter von meinen eigens geschriebenen Methoden final sind. Das schließt die main mit ein.
Mein Welt beginnt also mit:
[c]public static void main(final String[] args)[/c]
Jetzt weiß ich auch, was mir an Code komisch vor kam.
Bei mir fängt es auch mit final an, aus dem Grund, das der Benutzer etwas eingibt und das Programm nicht die Eingabe verändern sollte. (Solange es nicht gewollt ist)
@TO: Mach überall (außer vor dem Main) bei den Methoden das static weg, dann dürfte der Quellcode auch nicht so viele/keine statics verlangen.