Problem mit Methode und Timer

  • Themenstarter Themenstarter delpiero223
  • Beginndatum Beginndatum
D

delpiero223

Gast
Hallo,
nach der etwas dämlichen Frage gestern, da ich beim Copy-Pasten einfach etwas übersehen hatte, folgt jetzt mal ein Problem, an welchem sogar der AzuBi hier in der Firma, in der ich Schulpraktikum mache 45 Minuten probiert hat und zu keiner Lösung des Problems gekommen ist.

Und zwar läuft mein Pong-Spiel an sich mittlerweile schon einwandfrei, sodass ich noch ein bisschen mit dem Farbmenü rumgespielt habe: Dort habe ich jetzt nämlich noch eine Möglichkeit für wechselnde Farben des Schlägers und des Balls eingebaut, welche aber nicht so funktioniert, wie sie es soll.

Und zwar rufe ich in einem Menü die Klicks auf einen Punkt an, die in der Klasse "MyActionListener" verarbeitet werden. So sieht das Ganze erst mal aus:

Java:
		if (e.getActionCommand().equalsIgnoreCase("farbwechsel1")) {
			geschwindigkeit = 1;
			farbeWechseln = true;
			Farbe_wechseln();
		}

		if (e.getActionCommand().equalsIgnoreCase("farbwechsel2")) {
			geschwindigkeit = 50;
			farbeWechseln = true;
			Farbe_wechseln();
		}

		if (e.getActionCommand().equalsIgnoreCase("farbwechsel3")) {
			geschwindigkeit = 150;
			farbeWechseln = true;
			Farbe_wechseln();
		}

		if (e.getActionCommand().equalsIgnoreCase("farbwechsel4")) {
			geschwindigkeit = 500;
			farbeWechseln = true;
			Farbe_wechseln();
		}

		if (e.getActionCommand().equalsIgnoreCase("farbwechsel5")) {
			geschwindigkeit = 5000;
			farbeWechseln = true;
			Farbe_wechseln();
		}

Stellt man nur eine Farbe ein, wird der Boolean farbeWechseln == false gesetzt, (was leider nicht richtig funktioniert). Bei einem Farbwechsel wird dann die Methode Farbe_wechsen aufgerufen und die geschwindigkeit für das Wechseln der Farbe übergeben. Die Methode sieht so aus:

Java:
	public void Farbe_wechseln() {
		TimerTask timerTask = new TimerTask() {
			public void run() {
				if (farbeWechseln == true) {
					zufallszahl = (int) (Math.random() * 7 + 1);
					switch (zufallszahl) {
					case 1:
						Renderer.farbe = Color.white;
						Farbe_wechseln();
						break;
					case 2:
						Renderer.farbe = Color.cyan;
						Farbe_wechseln();
						break;
					case 3:
						Renderer.farbe = Color.green;
						Farbe_wechseln();
						break;
					case 4:
						Renderer.farbe = Color.yellow;
						Farbe_wechseln();
						break;
					case 5:
						Renderer.farbe = Color.blue;
						Farbe_wechseln();
						break;
					case 6:
						Renderer.farbe = Color.magenta;
						Farbe_wechseln();
						break;
					case 7:
						Renderer.farbe = Color.red;
						Farbe_wechseln();
						break;
					}
				}
			}
		};

		timer.schedule(timerTask, geschwindigkeit);

	}

Das mit dem Boolean habe ich eben erst schnell eingebaut. Es funktioniert aber genau so wenig wie der Rest: Beim ersten Mal klappt das Umstellen zwar korrekt, ändert man danach jedoch die Geschwindigkeit für den Timer, so laufen beide Funktionen jedoch nur parallel ab, wodurch das schnelle Wechseln erhalten bleibt. Auch, wenn der Boolean-Wert "false" ist, ignoriert die Funktion das.

Weiß jemand Rat?
 
Und wie soll das funktionien? timer.stop() funktioniert zumindest nicht und für die Java-Hilfe bin ich anscheiennd zu blöd 😀
 
Edit geht leider nicht als Gast, daher: mit "return" habe ich schon alles durchprobiert, hat auch nicht geklappt.
 
[EDIT]Du musst dir den laufenden Timer natürlich merken. Ob du den TimerTask jedes Mal wieder neu anlegen musst, ist auch noch die Frage.[/EDIT]

Vermutlich suchst du dann [c]timer.cancel()[/c]. Danach kannst du vermutlich den selben timer wiederverwenden, um erneut zu schedulen. Also reicht vielleicht einfach
Code:
timer.cancel();
zu Beginn deiner Methode
Code:
Farbe_wechseln()
.

[TIPP]Die sollte anders heißen. Methodennamen sollten nach Möglichkeit mit einem Verb beginnen und außerdem den Javakonventionen genügen.
Code:
wechsleFarbe()
oder noch besser
Code:
changeColor()
wäre ein besserer Name.

Allerdings sollte ein Methodenname auch ausdrücken, was in der Methode passiert.
Code:
startColorChangeTimer()
ist zwar unhandlich, sagt aber, was hier passiert.[/TIPP]
 
Zuletzt bearbeitet:
Danke schon einmal für Antwort(en). Wo bzw. wie soll ich das dann einbauen, damit es wie erwähnt funktioniert. Wenn ich es in die ActionListener integriere, kommt ja "IllegalStateexception", wenn ich vorher noch keinen Timer gestartet habe.

Sorry für die blöden Fragen.
 
Probiere es mal so:

Java:
	public void Farbe_wechseln() {
		TimerTask timerTask = new TimerTask() {
			public void run() {
				if (farbeWechseln == true) {
					zufallszahl = (int) (Math.random() * 7 + 1);
					switch (zufallszahl) {
					case 1:
						Renderer.farbe = Color.white;
						Farbe_wechseln();
						break;
					case 2:
						Renderer.farbe = Color.cyan;
						Farbe_wechseln();
						break;
					case 3:
						Renderer.farbe = Color.green;
						Farbe_wechseln();
						break;
					case 4:
						Renderer.farbe = Color.yellow;
						Farbe_wechseln();
						break;
					case 5:
						Renderer.farbe = Color.blue;
						Farbe_wechseln();
						break;
					case 6:
						Renderer.farbe = Color.magenta;
						Farbe_wechseln();
						break;
					case 7:
						Renderer.farbe = Color.red;
						Farbe_wechseln();
						break;
					}
				}
			}
		};

		timer.cancel();
		timer.schedule(timerTask, geschwindigkeit);

	}


Neu ist nur die Zeile 40.

[EDIT]Wenn du ein minimales, lauffähiges Beispiel erstellst, probiere ich auch gern mit daran herum.[/EDIT]
 
Zuletzt bearbeitet:
Vielen Dank auch noch mal für den Nachtrag von dir. Zu Beginn der Methode kann ich es ja nicht setzen, da zu Beginn noch kein Timer definiert ist und dann wieder der Fehler "Timer already cancelled" erscheint.

Ich habe es hier immer so gemacht, dass ich Methoden groß geschrieben habe, ist aber heute sowieso mein letzter Tag hier. Trotzdem versuche ich mich dann natürlich, daran so halten ,wenn es denn so üblich ist.

Wie soll ich es denn sonst machen, wenn ich den Timertask nicht immer neu definiere?

Grüße,
Peer
 
Ich seh leider nicht, wo du den timer erstellst. Sonst ginge es vielleicht auch so:

Java:
    public void Farbe_wechseln() {
        TimerTask timerTask = new TimerTask() { ... };
 
        if (null != timer) {
            timer.cancel();
            timer = null;
        }
        timer = new Timer();
        timer.schedule(timerTask, geschwindigkeit);
    }

Da fehlt mir trotz nochmaliger Lektüre zum Thema Timer / TimerTask die Erfahrung und ein Beispiel zum probieren.
 
Und schon wieder muss ich doppelposten. Der Code in der 40. Zeile klappt ja nicht, da beim ersten Aufruf der Methode noch kein Timer gesetzt ist.

Was meinst du mit dem laufenden Beispiel?
 
Wie soll ich es denn sonst machen, wenn ich den Timertask nicht immer neu definiere?

Dann müsstest du den Task einmal erstellen und immer wieder in den Timer einsetzen. Ich bin mir nicht wirklich sicher, ob es besser ist, weil man eine "globale" Variable, nämlich den Task, mehr mit sich rum schleppt. Die Alternative sähe dann so aus:

Java:
 private TimerTask timerTask;

    private TimerTask defineColorChangeTimerTask() {
        TimerTask timerTask = new TimerTask() {
            public void run() {
                if (farbeWechseln == true) {
                    zufallszahl = (int) (Math.random() * 7 + 1);
                    switch (zufallszahl) {
                    case 1:
                        Renderer.farbe = Color.white;
                        Farbe_wechseln();
                        break;
                    case 2:
                        Renderer.farbe = Color.cyan;
                        Farbe_wechseln();
                        break;
                    case 3:
                        Renderer.farbe = Color.green;
                        Farbe_wechseln();
                        break;
                    case 4:
                        Renderer.farbe = Color.yellow;
                        Farbe_wechseln();
                        break;
                    case 5:
                        Renderer.farbe = Color.blue;
                        Farbe_wechseln();
                        break;
                    case 6:
                        Renderer.farbe = Color.magenta;
                        Farbe_wechseln();
                        break;
                    case 7:
                        Renderer.farbe = Color.red;
                        Farbe_wechseln();
                        break;
                    }
                }
            }
        };

        return timerTask;
    }

    public void Farbe_wechseln() {
        if (null == timerTask) {
            timerTask = defineColorChangeTimerTask();
        }

        // .... timer starten siehe oben

    }
 
Ob das besser ist, bin ich mir auch nicht sicher. Aber dies dürfte doch eigentlich nichts mit dem Problem zu tun haben, oder?

Ich bin beim Versuch, ein kleines, lauffähiges Problem mit der Thematik zu erstellen leider gescheitert, daher lade ich dir das ganze Pong-Programm jetzt einfach mal als zip-Datei hoch.

Hier ist es:

Desktop.zip

Es dürfte in Eclipse direkt zu importieren sein. Vor dem Start muss leider noch die Schriftart im Renderer umgestellt oder die Beigelegte installiert werden
 
Ich hab auch mal herumexperimentiert, man muss den TimerTask neu definieren, da man sonst den Fehler [c]Task already scheduled or cancelled[/c] bekommt.
 
Vielen Dank für das zur Verfügung Stellen des Codes. Ich hatte jetzt aber schon selbst ein Beispiel gebastelt:

[java=3]import java.awt.Color;
import java.util.Timer;
import java.util.TimerTask;

public class TimerTaskTest {

public class Renderer {
public Color farbe;
}

private boolean farbeWechseln;
private int zufallszahl;
private int geschwindigkeit;
private Timer timer;
private final Renderer renderer;
private TimerTask timerTask;

public TimerTaskTest() {
zufallszahl = 0;
geschwindigkeit = 1000;
renderer = new Renderer();
farbeWechseln = true;

boolean running = true;
while (running) {
System.out.println("Geschwindigkeit ist " + geschwindigkeit);
changeColor();
sleep(5000);
geschwindigkeit -= 100;
if (geschwindigkeit < 1) {
running = false;
}
}
if (null != timer) {
timer.cancel();
timer = null;
}
}

private void sleep(long sleepingTime) {
try {
Thread.sleep(sleepingTime);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}

private TimerTask defineColorChangeTimerTask() {
TimerTask timerTask = new TimerTask() {
public void run() {
if (farbeWechseln == true) {
zufallszahl = (int) (Math.random() * 7 + 1);
switch (zufallszahl) {
case 1:
renderer.farbe = Color.white;
changeColor();
break;
case 2:
renderer.farbe = Color.cyan;
changeColor();
break;
case 3:
renderer.farbe = Color.green;
changeColor();
break;
case 4:
renderer.farbe = Color.yellow;
changeColor();
break;
case 5:
renderer.farbe = Color.blue;
changeColor();
break;
case 6:
renderer.farbe = Color.magenta;
changeColor();
break;
case 7:
renderer.farbe = Color.red;
changeColor();
break;
}
}
System.out.println("Farbe gesetzt auf " + renderer.farbe);
}
};

return timerTask;
}

public void changeColor() {
timerTask = defineColorChangeTimerTask();
if (null != timer) {
timer.cancel();
timer = null;
}
timer = new Timer();
timer.schedule(timerTask, geschwindigkeit);
}

public static void main(String[] args) {
new TimerTaskTest();
}

}
[/code]

Ausgabe:

Code:
Geschwindigkeit ist 1000
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Geschwindigkeit ist 900
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Geschwindigkeit ist 800
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Geschwindigkeit ist 700
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Geschwindigkeit ist 600
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Geschwindigkeit ist 500
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]

und so weiter. Allerdings bekomme ich darunter mitten drin noch eine

Code:
Exception in thread "main" java.lang.IllegalStateException: Task already scheduled or cancelled
	at java.util.Timer.sched(Unknown Source)
	at java.util.Timer.schedule(Unknown Source)
	at threads.TimerTaskTest.changeColor(TimerTaskTest.java:101)
	at threads.TimerTaskTest.<init>(TimerTaskTest.java:29)
	at threads.TimerTaskTest.main(TimerTaskTest.java:105)
 
Hm... mich musst du nicht fragen, ich habe keine Ahnung davon 😀

Ich bin mal 30 Minuten weg, bis denne.
 
Ah! Du rufst immer wieder
Code:
Farbe_wechseln()
aus dem
Code:
TimerTask
auf!

So sieht es besser aus:

[JAVA=3]import java.awt.Color;
import java.util.Timer;
import java.util.TimerTask;

public class TimerTaskTest {

public class Renderer {
public Color farbe;
}

private boolean farbeWechseln;
private int zufallszahl;
private int geschwindigkeit;
private Timer timer;
private final Renderer renderer;

public TimerTaskTest() {
zufallszahl = 0;
geschwindigkeit = 1000;
renderer = new Renderer();
farbeWechseln = true;

boolean running = true;
while (running) {
System.out.println("Geschwindigkeit ist " + geschwindigkeit);
changeColor();
sleep(5000);
geschwindigkeit -= 100;
if (geschwindigkeit < 1) {
running = false;
}
}
if (null != timer) {
timer.cancel();
timer = null;
}
}

private void sleep(long sleepingTime) {
try {
Thread.sleep(sleepingTime);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}

private TimerTask defineColorChangeTimerTask() {
System.out.println("defineColorChangeTimerTask() start mit Geschwindigkeit " + geschwindigkeit);
TimerTask timerTask = new TimerTask() {
public void run() {
if (farbeWechseln == true) {
zufallszahl = (int) (Math.random() * 7 + 1);
switch (zufallszahl) {
case 1:
renderer.farbe = Color.white;
break;
case 2:
renderer.farbe = Color.cyan;
break;
case 3:
renderer.farbe = Color.green;
break;
case 4:
renderer.farbe = Color.yellow;
break;
case 5:
renderer.farbe = Color.blue;
break;
case 6:
renderer.farbe = Color.magenta;
break;
case 7:
renderer.farbe = Color.red;
break;
}
}
System.out.println("Farbe gesetzt auf " + renderer.farbe);
}
};

return timerTask;
}

public void changeColor() {
System.out.println("changeColor() Start mit Geschwindigkeit " + geschwindigkeit);
if (null != timer) {
timer.cancel();
timer = null;
}
timer = new Timer();
timer.scheduleAtFixedRate(defineColorChangeTimerTask(), 0, geschwindigkeit);
}

public static void main(String[] args) {
new TimerTaskTest();
}

}
[/code]

Ausgabe:

Code:
Geschwindigkeit ist 1000
changeColor() Start mit Geschwindigkeit 1000
defineColorChangeTimerTask() start mit Geschwindigkeit 1000
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Geschwindigkeit ist 900
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
changeColor() Start mit Geschwindigkeit 900
defineColorChangeTimerTask() start mit Geschwindigkeit 900
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Geschwindigkeit ist 800
changeColor() Start mit Geschwindigkeit 800
defineColorChangeTimerTask() start mit Geschwindigkeit 800
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Geschwindigkeit ist 700
changeColor() Start mit Geschwindigkeit 700
defineColorChangeTimerTask() start mit Geschwindigkeit 700
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Geschwindigkeit ist 600
changeColor() Start mit Geschwindigkeit 600
defineColorChangeTimerTask() start mit Geschwindigkeit 600
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=0]
Geschwindigkeit ist 500
changeColor() Start mit Geschwindigkeit 500
defineColorChangeTimerTask() start mit Geschwindigkeit 500
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Geschwindigkeit ist 400
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
changeColor() Start mit Geschwindigkeit 400
defineColorChangeTimerTask() start mit Geschwindigkeit 400
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Geschwindigkeit ist 300
changeColor() Start mit Geschwindigkeit 300
defineColorChangeTimerTask() start mit Geschwindigkeit 300
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Geschwindigkeit ist 200
changeColor() Start mit Geschwindigkeit 200
defineColorChangeTimerTask() start mit Geschwindigkeit 200
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Geschwindigkeit ist 100
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
changeColor() Start mit Geschwindigkeit 100
defineColorChangeTimerTask() start mit Geschwindigkeit 100
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=0,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=255,g=255,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=255]
Farbe gesetzt auf java.awt.Color[r=255,g=0,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]
Farbe gesetzt auf java.awt.Color[r=0,g=255,b=0]

Ist das das, was du erwartest?

[tipp]Was habe ich geändert?

1) die Aufrufe von
Code:
Farbe_wechseln()
bzw.
Code:
changeColor()
aus dem TimerTask entfernt.
2) timer jedes Mal neu erstellen. Alten Timer vorher beenden, falls vorhanden, siehe
Java:
        if (null != timer) {
            timer.cancel();
            timer = null;
        }
        timer = new Timer();
3)
Code:
timer.scheduleAtFixedRate(defineColorChangeTimerTask(), 0, geschwindigkeit);
anstelle von
Code:
timer.schedule(defineColorChangeTimerTask(), geschwindigkeit);
verwendet.

Der Rest ist Kosmetik[/tipp]
 
Zuletzt bearbeitet:
Vielen Dank für die Mühen, das sieht schon mal sehr gut aus. Leider bekomme ich es nun nicht vernünftig hin, den Code in meine Klasse zu bekommen, da der Aufbau deines Quelltextes ja fast komplett anders ist als mein bescheidener Code es war.
 
Dafür hab ich den grünen Kasten unten ergänzt, wo ich die wesentlichen Änderungen erläutert habe.

Also versuchsweise etwa so:

Java:
    public void Farbe_wechseln() {
        TimerTask timerTask = new TimerTask() {
            public void run() {
                if (farbeWechseln == true) {
                    zufallszahl = (int) (Math.random() * 7 + 1);
                    switch (zufallszahl) {
                    case 1:
                        Renderer.farbe = Color.white;
                        //Farbe_wechseln();
                        break;
                    case 2:
                        Renderer.farbe = Color.cyan;
                        //Farbe_wechseln();
                        break;
                    case 3:
                        Renderer.farbe = Color.green;
                        //Farbe_wechseln();
                        break;
                    case 4:
                        Renderer.farbe = Color.yellow;
                        //Farbe_wechseln();
                        break;
                    case 5:
                        Renderer.farbe = Color.blue;
                        //Farbe_wechseln();
                        break;
                    case 6:
                        Renderer.farbe = Color.magenta;
                        //Farbe_wechseln();
                        break;
                    case 7:
                        Renderer.farbe = Color.red;
                        //Farbe_wechseln();
                        break;
                    }
                }
            }
        };
 
        if (null != timer) {
            timer.cancel();
            timer = null;
        }
        timer = new Timer();
        timer.scheduleAtFixedRate(timerTask, 0, geschwindigkeit);
 
    }
 
Zuletzt bearbeitet:
Den Kasten habe ich ja gesehen, nur funktioniert es auch mit dem Code noch nicht, den du eben geschrieben hast 🙁
 
Was genau funktioniert denn nicht? Was passiert, und was soll passieren? Es kann gut sein, dass ich die Intention deines Codes missverstanden habe.

Beschreibe am besten das, was raus passieren soll und was im Moment passiert.
 
Es funktioiniert immer noch genau das nicht, was im Eingangspost auch schon nicht funktionierte: Klicke ich oben in der Menüleiste auf eine Geschwindigkeit für die Farbwechlsung, funktioniert das erst einmal und die Farbe wechselt in der gewünschten Geschwindifgkeit.

Klicke ich dann noch einmal auf eine Geschwindigkeit im Menü oder eine einzelne Farbe, so überlagern sich beide Timer anscheinend immer noch und das Wechseln der Farbe bleibt sehr schnell.

Grüße,
Peer
 
Ich schau mir mal deinen Code an. Und muss gerade alle Umlaute umsetzen, weil die bei mir als seltsame Rauten und Compilerfehler angezeigt werden. Bitte KEINE Umlaute benutzen in Zukunft.
 
Das tut mir Leid, ich habe mich nur gefreut gehabt, dass Eclipse und Java mit ihnen umgehen können und sie dann gleich genutzt :shame:
 
Bei mir ist das übrigens nicht so: Ich habe die Sachen aus dem zip-Ordner eben mal wieder extrahiert und in Eclipse importiert -> Keine Probleme

p.s. ich habe mich hier mal registriert. Es ist nicht möglich, die Gast-Beiträge irgendwie zu überschreiben, oder?
 
Nein ich denke nicht.

Liegt vermutlich daran, dass ich bei mir alles in utf8 mache. Daten, Quellcode, ...


Ich kann das Problem nun nachvollziehen. Mal sehen.


Was mir auffällt aber damit wohl nichts zu tun hat: DU erstellst zig neue Instanzen des ActionListeners. Das ist eigentlich unnötig, da kann an alle die gleiche Instanz übergeben werden.


Davon ab wären vermutlich Listen für viele Dinge gut zur Codeverschlankung, aber auch das ist nicht das Problem.

[EDIT]Wobei: Dann hat jeder dieser ActionListener seinen eigenen Timer und dann passiert natürlich unheil! Ich teste das mal eben...[/EDIT]
 
Zuletzt bearbeitet:
Wenn du gerade einen Tipp hättest, wie ich die ActionListener nur einmal verwenden kann, wäre ich auch dankbar. Etwa 2 Stunden kann ich an dem Code noch arbeiten, dann ist das Praktikum erst einmal vorbei. 🙁
 
1.) Im Renderer alle [c]new MyActionListener()[/c] per suchen und ersetzten durch [c]myActionListener [/c] ersetzen.

2.) vor dem ersten Vorkommen von [c]myActionListener [/c] die Zeile [c]MyActionListener myActionListener = new MyActionListener();[/c] einfügen.


Behebt das Problem allerdings noch nicht.
 
Problem gelöst! Zusätzlich noch den Aufruf [c]wechsleFarbe();[/c] im TimerTask in
Code:
wechsleFarbe()
unterlassen! Das ist in Zeile 266 in der Klasse MyActionListener.

[EDIT]Das Problem war also dreierlei:

1) Jeder Menüeintrag hatte seine eigene Kopie vom Actionlistener, dadurch hatte jede dieser Kopien ihren eigenen Timer. Wenn in Kopie 1 der schnelle Wechsel per Timer angelegt wurde und dann in Kopie zwei ein langsamerer, hat Kopie zwei versucht, SEINEN Timer zu canceln, der war aber gar nicht aktiv, da es der Timer in Kopie 1 war.

2) Durch den erneuten Aufruf von wechsleFarbe im TimerTask wurden dauernd neue Tasks erstellt, statt den einen Task in Ruhe arbeiten zu lassen.

3) Du hattest den Task immer nur einmal anlaufen lassen, deshalb vermutlich auch der neue Start, der aber unabhängig von der Geschwindigkeit dann griff. Das vermeidet man durch: In
Code:
wechsleFarbe()
unter der TimerTask-Definiton
Java:
        if (null != timer) {
            timer.cancel();
            timer = null;
        }
        timer = new Timer();
        timer.scheduleAtFixedRate(timerTask, 0, geschwindigkeit);
hineinschreiben.
[/EDIT]
 
Zuletzt bearbeitet:
In Zeile 266 steht das doch überhaupt nicht. Wenn ich es aber aus Zeile 262 rausnehme, wechselt die Farbe immer noch nur einmal 🙁

[OT]Ich glaube, ich bin zu blöd dafür (und teste den OT-Kasten mal aus)[/OT]
 
Zur Not packe ich dir die funktionierende Version ein.

Vorher probiere mal diese Methode einzubauen:

Java:
    public void wechsleFarbe() {
        final TimerTask timerTask = new TimerTask() {
            public void run() {
                if (farbeWechseln == true) {
                    zufallszahl = (int) (Math.random() * 7 + 1);
                    switch (zufallszahl) {
                    case 1:
                        Renderer.farbe = Color.white;
                        break;
                    case 2:
                        Renderer.farbe = Color.cyan;
                        break;
                    case 3:
                        Renderer.farbe = Color.green;
                        break;
                    case 4:
                        Renderer.farbe = Color.yellow;
                        break;
                    case 5:
                        Renderer.farbe = Color.blue;
                        break;
                    case 6:
                        Renderer.farbe = Color.magenta;
                        break;
                    case 7:
                        Renderer.farbe = Color.red;
                        break;
                    }
                }
            }
        };
        if (null != timer) {
            timer.cancel();
            timer = null;
        }
        timer = new Timer();
        timer.scheduleAtFixedRate(timerTask, 0, geschwindigkeit);
    }

Und

1.) Im Renderer alle [c]new MyActionListener()[/c] per suchen und ersetzten durch [c]myActionListener [/c] ersetzen.

2.) vor dem ersten Vorkommen von [c]myActionListener [/c] die Zeile [c]MyActionListener myActionListener = new MyActionListener();[/c] einfügen.

hast du gemacht, ja?
 
Zuletzt bearbeitet:
Gerne :thumbup:

edit: es geht aber immer noch nicht, wenn ich über die Einstellungen später wieder eine langsamere Farbwechselgeschwindigkeit einbauen möchte.
 
Sehr schön. Das ist ein nettes Programm, auch wenn du nach und nach einige Sachen im Code verschönern solltest. Methoden entschlacken, dich nicht wiederholen (DRY), Namenskonventionen einhalten, Methoden nicht zu lang werden lassen etc., aber das sind alles nur Feinheiten. Helfen dir aber auch, den Überblick zu wahren und erleichtern anderen, durch den Code durchzusteigen.
 
Danke für die netten Worte und noch einmal auch für die Hilfe. Wenn ich nach dem Praktikum, was gerade vorbei ist, noch einmal die Zeit dafür habe, werde ich das natürlich tun und Eclipse auch noch mal auf den heimischen Rechner laden.
 

Zurück
Oben