perillitommaso (Normal User)
Pro
Messaggi: 186
Iscritto: 28/01/2014
|
allora inizialmente ho avuto problemi nell implementazione del cronometro con i thread e la gui, però poi sono riuscito a trovare un algoritmo che mi faccia funzionare il tutto. L'unico problema è che quando chiudo il thread e quindi la finestra del cronometro(chiudo sia il thread e sia la finestra tramite un bottone presente nel programma principale), il cronometro continua a contare i secondi partendo dai secondi contati precedentemente.. io invece vorrei che quando chiudo il thread e poi lo riapro iniziasse a contare da 0. Alla prima botta va tutto benissimo mentre quando chiudo e riapro ho questo problema. posto dei pezzi di codice che possono servire:
questa è la classe dove è implementato lo svolgimento del thread
Codice sorgente - presumibilmente Java |
public class Cronometro implements Runnable{ private JLabel visualizzazione ; private long startTime = System. currentTimeMillis ();; public Cronometro (JLabel labelTime ) { // TODO Auto-generated constructor stub visualizzazione = labelTime; } @Override public void run() { // TODO Auto-generated method stub while(true){ long diffTime = System. currentTimeMillis () - startTime ; int decSeconds = (int) (diffTime % 1000 / 100); int seconds = (int) (diffTime / 1000 % 60); int minutes = (int) (diffTime / 60000 % 60); int hours = (int) (diffTime / 3600000); String s = String. format ("%d:%02d:%02d.%d", hours, minutes, seconds, decSeconds); visualizzazione.setText (s); } } }
|
qui invece è implementata una finestra che appartiene al programma principale ( è come se il programma principale abbia 2 finestra, la prima che è quella dove è presente il bottone di stop, la seconda che è quella che compare quando avvio il cronometro )
Codice sorgente - presumibilmente Java |
private void creafinestra() { Cronometro cron = new Cronometro(labelTime); labelTime. setFont (new Font ("SansSerif", Font. BOLD, 30 )); labelTime. setHorizontalAlignment (JLabel. CENTER); buttonStop.setEnabled (false); @Override // TODO Auto-generated method stub if(processocronometro.isAlive()){ processocronometro.resume(); }else{ processocronometro.start(); } buttonStart.setEnabled (false); buttonStop.setEnabled (true); }}); @Override // TODO Auto-generated method stub processocronometro.suspend(); buttonStart.setEnabled (true); buttonStop.setEnabled (false); }}); panelButtons.add (buttonStart); panelButtons.add (buttonStop); finestracronometro.addWindowListener(new GestoreFinestra(finestracronometro)); finestracronometro. setDefaultCloseOperation (JFrame. DO_NOTHING_ON_CLOSE); finestracronometro.setSize (220, 140); finestracronometro.setLocation(500,350); finestracronometro.setVisible(true); } }
|
qui è dove si avvia il cronometro:
Codice sorgente - presumibilmente Plain Text |
if(pulsante.equals(this.cronometro)){
creafinestra();
this.cronometro.setEnabled(false);
this.finecronometro.setEnabled(true);
}
|
qui è dove chiudo la finestra e quindi anche il thread:
Codice sorgente - presumibilmente Plain Text |
if(pulsante.equals(this.finecronometro)){
this.finecronometro.setEnabled(false);
this.cronometro.setEnabled(true);
finestracronometro.setVisible(false);
labelTime.setText("0:00:00.0");
}
|
mentre questa è la classe gestorepulsante con l'actionlistener metto solo gli attributi che servono )
Codice sorgente - presumibilmente Java |
private OraBari orarioattuale = new OraBari(); private JFrame finestracronometro = new JFrame("Cronometro");
|
spero di essere stato chiaro.. ripeto: l'unico problema che riscontro è quello che quando vado a riaprire il thread, il cronometro continua a contare dai secondi dove si è fermato prima, io invece voglio che iniziasse a contare da 0 come la prima volta che lo lancio! |