Java | Thread.sleep

Gadget2

PC-Selbstbauer(in)
Okay, ich habe einmal eine Frage zu Thread.sleep(). Folgender Code stellt meine Problemstellung da:

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

/**
  *
  * Beschreibung: bei Knopfdruck soll sich das Label für 3 Sekunden lang rot färben, dann wider grau werden
  *
  * @version 1.0 vom 20.11.2013
  * @author 
  */

public class Testgui extends JFrame {
  // Anfang Attribute
  private JPanel jPanel1 = new JPanel(null, true);
    private JButton btn = new JButton();
    private JLabel lbl = new JLabel();
  // Ende Attribute
  
  public Testgui(String title) { 
    // Frame-Initialisierung
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 300; 
    int frameHeight = 300;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten
    
    jPanel1.setBounds(0, 0, 297, 273);
    jPanel1.setOpaque(false);
    cp.add(jPanel1);
    btn.setBounds(48, 48, 73, 33);
    btn.setText("btn");
    btn.setMargin(new Insets(2, 2, 2, 2));
    btn.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        btn_ActionPerformed(evt);
      }
    });
    jPanel1.add(btn);
    lbl.setBounds(144, 96, 75, 33);
    lbl.setText("text");
    jPanel1.add(lbl);
    // Ende Komponenten
    
    setVisible(true);
  } // end of public Testgui
  
  // Anfang Methoden
  public void btn_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
    lbl.setForeground(new Color(255, 0, 0)); //Label rot färben
    try { //3 Sekunden warten
      Thread.sleep(3000);
    }catch(InterruptedException e) {
      e.printStackTrace();
    }
    Thread.yield();
    lbl.setForeground(new Color(51, 51, 51)); //Label wieder Standart färben
  } // end of btn_ActionPerformed
  
  // Ende Methoden
  
  public static void main(String[] args) {
    new Testgui("Testgui");
  } // end of main
  
} // end of class Testgui

Ziel des Ganzen ist, dass nach einem Klick auf den Button das Label für 3 Sekunden lang rot leuchtet und dann wieder grau wird. So wie das Thread.sleep jetzt eingebracht ist, wartet die GUI auch brav drei Sekunden, aber ohne das Label vorher rot gefärbt zu haben.

Ich grübel jetzt schon etwas länger daran, aber in meinem konkreten Beispiel konnte ich es bisher noch nicht zum Laufen bringen, vielleicht kann mir ja jemand dabei helfen. :daumen:

LG
 
Thread.sleep() ist böse. SEEEHR BÖSE!


Edit: Weil ich eh langeweile habe. So macht man das:

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.Timer;
import java.util.TimerTask;

/**
  *
  * Beschreibung: bei Knopfdruck soll sich das Label für 3 Sekunden lang rot färben, dann wider grau werden
  *
  * @version 1.0 vom 20.11.2013
  * @author 
  */

public class Testgui extends JFrame {
  private JPanel jPanel1 = new JPanel(null, true);
  private JButton btn = new JButton();
  private JLabel lbl = new JLabel();
  
  public Testgui(String title) { 
    super(title);
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 300; 
    int frameHeight = 300;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Container cp = getContentPane();
    cp.setLayout(null);
    
    jPanel1.setBounds(0, 0, 297, 273);
    jPanel1.setOpaque(false);
    cp.add(jPanel1);
    btn.setBounds(48, 48, 73, 33);
    btn.setText("btn");
    btn.setMargin(new Insets(2, 2, 2, 2));
    btn.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        btn_ActionPerformed(evt);
      }
    });
    jPanel1.add(btn);
    lbl.setBounds(144, 96, 75, 33);
    lbl.setText("text");
    jPanel1.add(lbl);
    
    setVisible(true);
  }

  public void btn_ActionPerformed(ActionEvent evt) {
    lbl.setForeground(new Color(255, 0, 0));
    
	Timer timer = new Timer("Timer");
	TaskToExecute t = new TaskToExecute(lbl);
	
	timer.schedule(t, 3000);
  }
  
  public static void main(String[] args) {
    new Testgui("Testgui");
  }
  
}

class TaskToExecute extends TimerTask {
	private final JLabel label;
	public TaskToExecute(JLabel lbl) {
		this.label = lbl;
	}

	public void run() {
		label.setForeground(new Color(51, 51, 51));
	}
}
 
Zuletzt bearbeitet:
Zurück