2012-01-20 19 views
8

Estoy tratando de crear un reloj digital usando un hilo, ya que me parece la forma lógica en que uno lo haría. No estoy seguro de si lo estoy haciendo bien pero lo que tenía en mente es crear la hora del sistema actual inicial utilizando el constructor de JFrame y mostrarlo como texto usando una etiqueta. En el constructor, entonces creo el objeto de hilo con el que actualizar la hora.Creación de reloj digital usando un hilo

Luchando un poco y esperaba algún consejo sobre cómo hacerlo bien.

setDefaultCloseOperation((JFrame.EXIT_ON_CLOSE)); 
     setBounds(50, 50, 200, 200); 

     JPanel pane = new JPanel(); 
     label = new JLabel(); 

     //Font localTime = new Font("Lumina", Font.BOLD , 24); 

     pane.add(label); 
     add(pane); 
     sdf = new SimpleDateFormat("HH:mm:ss"); 
     date = new Date(); 

     s = sdf.format(date); 
     label.setText(s); 
     setVisible(true); 
     runner = new Thread(this); 

     while(runner == null) 
     { 
      runner = new Thread(this); 
      runner.start(); 

     } 

Este es entonces mi método run() para actualizar el reloj cada segundo.

public void run() 
{ 
    while(true) 
    { 
     try 
     { 
      Thread.sleep(1000); 
      sdf = new SimpleDateFormat("HH:mm:ss"); 
      date = new Date(); 
      s = sdf.format(date); 
      label.setText(s); 
     } 
     catch(Exception e){} 

    } 

Método principal.

public static void main(String[] args) 
{ 
    new DigitalClock().setVisible(true); 


} 
+0

¿Con qué estás luchando específicamente? También parece que el corredor nunca será nulo, ya que crea una instancia y le asigna un objeto Thread justo antes de su while (runner == null) check. Oh y +1 puramente por la rareza de ver una pregunta de tarea que se ha intentado antes de preguntar aquí :) –

Respuesta

2

El estado de la etiqueta debe actualizarse en la secuencia de envío del evento.

es necesario agregar la siguiente modificación:

SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      label.setText(s); 
     } 
    }); 

en lugar de simplemente actualizando la etiqueta del hilo separado.

Vale la pena echar un vistazo a la simple descripción de The Swing GUI Freezing Problem y es una solución simple.

2

¿Qué desea mejorar? Se ve bien, while(runner == null) no es necesario, estás inicializando el corredor justo arriba.