2012-06-15 17 views
5

Sono un principiante Java e sto provando a creare un semplice programma di cronometro che visualizza l'ora su una GUI swing. La creazione del cronometro è semplice, tuttavia non riesco a trovare un modo per aggiornare la GUI ogni secondo e visualizzare l'ora corrente sul cronometro. Come posso fare questo?Java Stopwatch che aggiorna la GUI ogni secondo?

+10

Utilizzare la classe 'Timer' di' Swing'. Ulteriori informazioni sull'uso del 'Timer' sono disponibili, ad esempio, [nella domanda e in particolare le risposte ad esso.] (Http://stackoverflow.com/q/11053097/613495) – Boro

+3

Vedi anche questa [risposta] (http://stackoverflow.com/a/5529043/230513). – trashgod

+0

Sì, lo so che ce l'ho da qualche parte [una delle mie risposte relative all'uso di 'Timer'] (http://stackoverflow.com/a/5911514/613495). @trashgod molto bella risposta/campione +1 qui e +1 lì ... e io sono senza voti ... per oggi :) – Boro

risposta

6

Qualcosa in questo senso dovrebbe farlo:

import java.awt.EventQueue; 
import java.util.Timer; 
import java.util.TimerTask; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

/** @see https://stackoverflow.com/a/11058263/230513 */ 
public class Clock { 

    private Timer timer = new Timer(); 
    private JLabel timeLabel = new JLabel(" ", JLabel.CENTER); 

    public Clock() { 
     JFrame f = new JFrame("Seconds"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(timeLabel); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
     timer.schedule(new UpdateUITask(), 0, 1000); 
    } 

    private class UpdateUITask extends TimerTask { 

     int nSeconds = 0; 

     @Override 
     public void run() { 
      EventQueue.invokeLater(new Runnable() { 

       @Override 
       public void run() { 
        timeLabel.setText(String.valueOf(nSeconds++)); 
       } 
      }); 
     } 
    } 

    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       final Clock clock = new Clock(); 
      } 
     }); 
    } 
} 

Il timeLabel sarà sempre visualizzare il numero di secondi il timer è stato in funzione.

  1. È necessario formattarlo correttamente per visualizzare "hh: mm: ss"; un approccio è mostrato here.

  2. Creare un contenitore e aggiungere l'etichetta in modo che sia possibile visualizzarlo come parte della GUI.

  3. Confrontare il risultato con questo alternate utilizzando javax.swing.Timer.

+0

Ho realizzato la GUI utilizzando l'editor visuale di netbeans, come posso fare riferimento a una jlabel all'interno della GUI? – Dangerosking

+0

@trashgod quale parte richiede un invokeLater? – GETah

+0

@GETah Il metodo 'run()' di 'UpdateUITask', poiché un java.util.Timer lo eseguirà fuori dall'EDT. – millimoose