JButton Hintergrund zur Laufzeit ändern

Tsunamii

Mitglied
Suche nun schon seit einigen Tagen nach einer Lösung für diese Problem aber nichts scheint zu helfen

Ich bastel momentan an einem WerWirdMillionär um einige neue Sachen zu lernen und bereits gelerntes zu vertiefen.
Das Spiel ist auch so weit fast fertig und funktioniert auch fehlerfrei, aber eine Kleinigkeit würde ich gerne noch einfügen.

Wenn bei WWM der Kandidat eine Antwort einloggt, wird diese ja für einige Zeit gelb und ändert danach je nachdem ob richtig oder falsch die Farbe nach rot oder grün und bleibt dann noch ein kurze zeit so.

Mein ActionPerformed sieht momentan so aus:
PHP:
		for (int i=0; i<4; i++)
			if (e.getSource().equals(ansButtons.elementAt(i))) {
				ansButtons.elementAt(i).setBackground(Color.YELLOW);
				ansButtons.elementAt(i).repaint();
				try {Thread.sleep(5000);} catch (InterruptedException e1) {}
//				Aktion falls richtige Antwort ausgewählt
				if (i+1 == Integer.parseInt(theQuestion.elementAt(5))) {
//					Falls die letzte Frage schon erreicht ist
					if (curStep == WIN)
						WIN_SCREEN.setVisible(true);
					else {
						curStep++;
						printOnScreen();
					}
				}
//				Aktion falls falsche Antwort ausgewählt
				else {
					LOSE_SCREEN.setVisible(true);
				}
			}

Ich habe nun folgendes Problem:
wenn ich eine Antwort auswähle, wird zwar 5 Sekunden gewartet aber die Farbe des Buttons wird nicht vorher sondern erst nach dem Warten geändert und erst dann wenn die Frage bereits gewächselt wird.

Nun meine Frage an all die Fachkundigen hier im Forum:
Wie muss ich den Code abändern, dass er sich so verhält wie erwünscht.

Es wäre wirklich lieb, wenn sich jemand finden würde der mir bei diesem Problem helfen kann.

MfG,
Stefan
 
oh
tut mir leid, war keine absicht

Hier der Code nochmal in JAVA-Tags:

Java:
        for (int i=0; i<4; i++)
            if (e.getSource().equals(ansButtons.elementAt(i))) {
                ansButtons.elementAt(i).setBackground(Color.YELLOW);
                ansButtons.elementAt(i).repaint();
                try {Thread.sleep(5000);} catch (InterruptedException e1) {}
//                Aktion falls richtige Antwort ausgewählt
                if (i+1 == Integer.parseInt(theQuestion.elementAt(5))) {
//                    Falls die letzte Frage schon erreicht ist
                    if (curStep == WIN)
                        WIN_SCREEN.setVisible(true);
                    else {
                        curStep++;
                        printOnScreen();
                    }
                }
//                Aktion falls falsche Antwort ausgewählt
                else {
                    LOSE_SCREEN.setVisible(true);
                }
            }
 
Danke für die Links bisher

Hab mal versucht das ganze mit nem extra Thread zu lösen, aber es funktioniert noch immer nicht wie es soll.

Hier mal die Klasse ColorChange:
Java:
import java.awt.Color;

import javax.swing.JButton;

public class ColorChanger extends Thread {

	JButton clicked;
	
	ColorChanger(JButton button) {
		clicked = button;
		
		run();
	}
	
	
	public void run() {
		clicked.setBackground(Color.YELLOW);
		clicked.repaint();
	}

}

und hier was ich in nun in der ActionPerformed Methode stehen habe:
Java:
new ColorChanger(ansButtons.elementAt(i));
try {Thread.sleep(1000);} catch (InterruptedException e1) {}

Aber aus irgendeinem Grund stoppt der sleep auch den aufgerufenen neuen Thread, nur ich hab leider keine Ahnung wieso.
Gibt es ne Alternative, die den neuen weiterlaufen lässt und nur das "Hauptprogramm" für 5sekunden ausbremst?


/EDIT:
Ok hab jetzt verstanden warum es die ganze Zeit nicht funktioniert hat.

Bin zur Zeit nur dran die Zeitintervalle aufeinander abzustimmen und so zu wählen, dass sie weder zu kurz noch zu lang sind.

Wenn ich fertig bin poste ich hier noch meine Lösung falls erwünscht
 
Zuletzt bearbeitet:
Wenn du im Thread, der Events verarbeitet "schlafen" lässt hängt in der Zeit das Ganze Fenster. Du muss also nicht das das repaint in einen anderen Thrad auslagern, sondern das sleep und die Aktionen die verzögert geschehen sollen.
 
Zuletzt bearbeitet:
Ich glaube für die Hintergrundfarbe ist nicht mal ein extra Aufruf von repaint() notwendig.

Es könnte in etwa so aussehen und ja ich meinte die sleep()-Methode, die ausgelagert werden muss:

Java:
public void actionPerformed(ActionEvent ae) {
// Schleife über die Buttons
//...
		if(ae.getSource() == ansButtons.elementAt(i)) {
			(new ColorChanger(ansButtons.elementAt(i))).start();
		}
//...
}

und ColorChanger:

Java:
public class ColorChanger extends Thread {

	private JButton clicked;
	
	public ColorChanger(JButton button) {
		clicked = button;
	}
	
	public void run() {
// Button bekommt "Wartefarbe"
		try {
			Thread.sleep(5000);
		}
		catch(InterruptedException ie) {
// Sleep abgebrochen		
              }
// Überprüfe Antwort und setze Farbe dementsprechend
	}
}

Edit: Ich weiß nicht, ob du das schon hast, aber ich würde noch ein Flag einführen, dass dir sagt, dass bereits eine Antwort ausgewählt ist und die keine weitere auswählen kannst. Deswegen würde ich den Thread auch so aufrufen, wie in dem Link, den ich gepostet habe (keine extra Klasse), weil dann kannst du innerhalb des Threads auf dieses Flag zugreifen.
 
Zuletzt bearbeitet:
danke noch einmal für all die hilfe

@HonniCilest:
habe jetzt ne Mischung aus internen und externen threads
und das mit den flags is ne gute idee, werd ich auf jeden fall noch einbauen
 
Zurück