sleep()

Cäptin Pommes

Erfahrenes Mitglied
Hallo,

ich hab folgendes problem:

Ich habe 4 JRadioButtons wo man die passende Antwort zu einer Frage aussuchen soll. Wenn man jetzt die antwort abgibt und auf den submit button klickt soll sich die Farbe und der Text eines Labels änder, in "Richtige Antwort" oder "Falsche Antwort", und wenn die antwort richtig war dann soll er die nächste Frage stellen.
der text des Labels was angibt ob man richtig lag wird dann wieder auf "" gesetzt.

Damit man aber ein wenig das "Richtige Antwort" bewunder kann dachte ich mir bau ich ein sleep(2000) ein ... nur leider sieht man nix mehr von der farb und text änderung obwohl das sleep erst nach "Richtige Antwort" kommt und vor dem "" .... ich hoffe ihr könnt mir folgen ^^
hier mal der code:

Java:
JButton submit = new JButton("Bestätigen");
		submit.setFont(new Font("Comic Sans MS",Font.PLAIN, 16));
		submit.setSize(120, 25);
		submit.setLocation(getWidth()/2 - submit.getSize().width/2, 265);
		submit.setBorder(new LineBorder(new Color(0,0,0)));
		submit.addActionListener(new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					if(answerCheck())
					{
						label1.setText("");
						createQuestion();
					}
				}
			}
		);

Java:
private boolean answerCheck()
	{
		int selectedButton = -1;
		
		if(answer1.isSelected())
			selectedButton=0;
		
		else if(answer2.isSelected())
			selectedButton=1;
		
		else if(answer3.isSelected())
			selectedButton=2;

		else if(answer4.isSelected())
			selectedButton=3;

		
			if(selectedButton == rightAnswer)
			{
				label1.setText("Richtige Antwort!");
				label1.setForeground(new Color(34, 177, 76));
				try
				{
					Thread.sleep(2000);
				}
				catch (Exception e1)
				{
					e1.printStackTrace();
				}
				return true;
			}
			else
			{
				label1.setText("Falsche Antwort!");
				label1.setForeground(Color.red);
				return false;
			}
	}
 
Wie soll er denn neu zeichnen wenn du den Dispatch-Thread blockierst? Hau answerCheck in nen eigenen Thread.
 
ich hab das mit rapaint() und validate() ausprobiert und vo dem try catch block gesetzt, hat aber nix geholfen ... soll ich das wo anders hin setzten?

Aber ich versteh das auch irgentwie nicht, ... alle anderen componenten (u.a. auch weitere Labels) werden doch auch gezeichnet warum aber gerade das nicht?
 
Diese wurden ja vorher gezeichnet.
Mit dem Eigenschafts-Änderungen bekomm das label1 auch den Befehl, neu gezeichnet zu werden. Das passiert im EDT, von dem auch der ActionListener abgearbeitet wird. Da der EDT gerade im Listener ist, kann er nicht neu zeichnen bis dieser fertig abgearbeitet wird, da ein Thread nun mal nur eine Methode gleichzeitig abarbeiten kann. (Sonst wäre Multithreading ja mehr oder weniger unnötig.)

Also machst du am Besten das, was ich schon vorher gesagt habe: Lasse die answerCheck von einen anderen Thread abarbeiten, damit der EDT frei bleibt.
 
ok, heisst das ich muss die methode answerCheck in eine extra klasse packen die dann runnable implementiert?
So ist es zu mindestens im Java Openbook gezeigt worden, ... aber ich wil eigentlich nur ungern wegen der einen methode ne Klasse machen :/
 
Du kannst im ActionListener eine anonyme Klasse erzeugen:

Java:
new Thread() {
	public void run()
	{
		checkAnswer();
	}
}.start();

Damit ist der EDT nach dem er den Thread erzeugt und die ActionPerformed verlassen hat wieder frei und kann beliebig neu zeichnen.
 
Zurück