Hallo zusammen,
ich bin gerade dabei ein Programm, welches Labyrinths generieren und lösen kann ein GUI zu erstellen.
(Hierzu nutze ich die neuste Eclipse Version)
Es lief bisher alles so wie ich es mir vorgestellt habe, jedoch bin ich jetzt auf ein Problem gestossen:
Ich möchte die Ausgabe bzw. den Lösungsweg Schrittweise darstellen und will in einem JPane für jeden gegangenen Schritt das Labyrinth aktualisieren. (Der Delay zwischen den Schritten soll über einen Slider verstellbar sein, ist aber Nebensache)
Bislang habe ich es hinbekommen, dass das Programm zwar den Weg schritweise erstellt, jedoch scheint es, als würden die repaint()-Anfragen aufgestaut, bis die Schleife, mit der ich die Schritte bestimmen und ausgeben will, vollständig durchlaufen wurde. Dadurch werden die Delays zu einem einzelnen langem und die gesamte schrittweise Ausgabe geschieht nicht schrittweise, sondern auf einmal.
Ich habe bereits ein wenig im Internet recherchiert und ein paar Dinge ausprobiert.
1. Ich anstelle von repaint() paintImmediatly() ausprobiert.
2. Ich habe verschiedene Wege getestet um den Delay umzusetzen (u.a. Einen Swing-Timer und einen selbstgebastelten), da ich zuerst dachte es hängt damit zusammen.
3. Ich habe einen Freund um Rat gefragt, jedoch sagte er mir, ich könne das Problem nicht über einen seperaten thread für das repaint() lösen, weil man in einer GUI nur einen thread nutzen könne.
Dies ist die Code, mit dem ich den Weg ermittle und entsprechend einfügen will:
PS: Bin Java-Anfänger, daher entschuldigt bitte den "gepfuschten" Code
ich bin gerade dabei ein Programm, welches Labyrinths generieren und lösen kann ein GUI zu erstellen.
(Hierzu nutze ich die neuste Eclipse Version)
Es lief bisher alles so wie ich es mir vorgestellt habe, jedoch bin ich jetzt auf ein Problem gestossen:
Ich möchte die Ausgabe bzw. den Lösungsweg Schrittweise darstellen und will in einem JPane für jeden gegangenen Schritt das Labyrinth aktualisieren. (Der Delay zwischen den Schritten soll über einen Slider verstellbar sein, ist aber Nebensache)
Bislang habe ich es hinbekommen, dass das Programm zwar den Weg schritweise erstellt, jedoch scheint es, als würden die repaint()-Anfragen aufgestaut, bis die Schleife, mit der ich die Schritte bestimmen und ausgeben will, vollständig durchlaufen wurde. Dadurch werden die Delays zu einem einzelnen langem und die gesamte schrittweise Ausgabe geschieht nicht schrittweise, sondern auf einmal.
Ich habe bereits ein wenig im Internet recherchiert und ein paar Dinge ausprobiert.
1. Ich anstelle von repaint() paintImmediatly() ausprobiert.
2. Ich habe verschiedene Wege getestet um den Delay umzusetzen (u.a. Einen Swing-Timer und einen selbstgebastelten), da ich zuerst dachte es hängt damit zusammen.
3. Ich habe einen Freund um Rat gefragt, jedoch sagte er mir, ich könne das Problem nicht über einen seperaten thread für das repaint() lösen, weil man in einer GUI nur einen thread nutzen könne.
Dies ist die Code, mit dem ich den Weg ermittle und entsprechend einfügen will:
Java:
do {
changes = false;
zufallszahl = (int)((Math.random()) * 4 + 1);
//Bestimmen, welches benachbarte Feld geprüft wird
switch (zufallszahl) {
case 1:
if(Feld[aktuelleSpalte][aktuelleZeile-1].contentEquals("Z"))
{
Feld[aktuelleSpalte][aktuelleZeile] = ".";
paintWay[aktuelleSpalte][aktuelleZeile] = ".";
aktuelleZeile = aktuelleZeile-1;
weg = weg + "UP\n";
changes=true;
schritte++;
}else {
if(Feld[aktuelleSpalte][aktuelleZeile-1].contentEquals(" "))
{
if(Feld[aktuelleSpalte][aktuelleZeile].contentEquals("S"))
{
aktuelleZeile = aktuelleZeile-1;
weg = weg + "UP\n";
changes=true;
schritte++;
}else {
Feld[aktuelleSpalte][aktuelleZeile] = ".";
paintWay[aktuelleSpalte][aktuelleZeile] = ".";
aktuelleZeile = aktuelleZeile-1;
weg = weg + "UP\n";
changes=true;
schritte++;
}
}
}
break;
case 2:
if(Feld[aktuelleSpalte+1][aktuelleZeile].contentEquals("Z"))
{
Feld[aktuelleSpalte][aktuelleZeile] = ".";
paintWay[aktuelleSpalte][aktuelleZeile] = ".";
aktuelleSpalte = aktuelleSpalte +1;
weg = weg + "RIGHT\n";
changes=true;
schritte++;
}else {
if(Feld[aktuelleSpalte+1][aktuelleZeile].contentEquals(" "))
{
if(Feld[aktuelleSpalte][aktuelleZeile].contentEquals("S"))
{
aktuelleSpalte = aktuelleSpalte+1;
weg = weg + "RIGHT\n";
changes=true;
schritte++;
}else {
Feld[aktuelleSpalte][aktuelleZeile] = ".";
paintWay[aktuelleSpalte][aktuelleZeile] = ".";
aktuelleSpalte = aktuelleSpalte+1;
weg = weg + "RIGHT\n";
changes=true;
schritte++;
}
}
}
break;
case 3:
if(Feld[aktuelleSpalte][aktuelleZeile+1].contentEquals("Z"))
{
Feld[aktuelleSpalte][aktuelleZeile] = ".";
paintWay[aktuelleSpalte][aktuelleZeile] = ".";
aktuelleZeile = aktuelleZeile +1;
weg = weg + "DOWN\n";
changes=true;
schritte++;
}else {
if(Feld[aktuelleSpalte][aktuelleZeile+1].contentEquals(" "))
{
if(Feld[aktuelleSpalte][aktuelleZeile].contentEquals("S"))
{
aktuelleZeile = aktuelleZeile+1;
weg = weg + "DOWN\n";
changes=true;
schritte++;
}else {
Feld[aktuelleSpalte][aktuelleZeile] = ".";
paintWay[aktuelleSpalte][aktuelleZeile] = ".";
aktuelleZeile = aktuelleZeile+1;
weg = weg + "DOWN\n";
changes=true;
schritte++;
}
}
}
break;
case 4:
if(Feld[aktuelleSpalte-1][aktuelleZeile].contentEquals("Z"))
{
Feld[aktuelleSpalte][aktuelleZeile] = ".";
paintWay[aktuelleSpalte][aktuelleZeile] = ".";
aktuelleSpalte = aktuelleSpalte -1;
weg = weg + "LEFT\n";
changes=true;
schritte++;
}else {
if(Feld[aktuelleSpalte-1][aktuelleZeile].contentEquals(" "))
{
if(Feld[aktuelleSpalte][aktuelleZeile].contentEquals("S"))
{
aktuelleSpalte = aktuelleSpalte-1;
weg = weg + "LEFT\n";
changes=true;
schritte++;
}else {
Feld[aktuelleSpalte][aktuelleZeile] = ".";
paintWay[aktuelleSpalte][aktuelleZeile] = ".";
aktuelleSpalte = aktuelleSpalte-1;
weg = weg + "LEFT\n";
changes=true;
schritte++;
}
}
}
break;
default:
break;
}
//Ende Feldüberprüfung, wenn es frei ist wird der Weg aktualisiert
if(changes==true) {
try {
Thread.sleep(slider.getValue()*1000);
} catch (InterruptedException e) {
JOptionPane.showInternalMessageDialog(null, "ERROR");
}
spaltenZaehler = 0;
zeilenZaehler = 0;
do {
do {
generatedMaze = generatedMaze + (paintWay[spaltenZaehler] [zeilenZaehler] + "");
spaltenZaehler++;
}while(spaltenZaehler<paintWay.length);
zeilenZaehler++;
generatedMaze = generatedMaze + "\n";
spaltenZaehler = 0;
}while(zeilenZaehler<paintWay[1].length);
System.out.println("log1");
textOutputMaze.repaint();
}
//Wenn sich etwas aktualisiert hat sollte mit der If-Abfrage dafür gesorgt werden, dass das JPane verzögert aktualisiert wird
}while(!Feld[aktuelleSpalte][aktuelleZeile].contentEquals("Z"));
//Ende Wegsuche
PS: Bin Java-Anfänger, daher entschuldigt bitte den "gepfuschten" Code
Zuletzt bearbeitet: