07/11/15 15:12
perillitommaso
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
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 )
qui è dove si avvia il cronometro:
qui è dove chiudo la finestra e quindi anche il thread:
mentre questa è la classe gestorepulsante con l'actionlistenermetto solo gli attributi che servono )
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!
questa è la classe dove è implementato lo svolgimento del thread
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 )
private void creafinestra() { Cronometro cron = new Cronometro(labelTime); final Thread processocronometro = new Thread(cron); labelTime.setFont (new Font ("SansSerif", Font.BOLD, 30)); labelTime.setHorizontalAlignment (JLabel.CENTER); final JButton buttonStart = new JButton ("START"); final JButton buttonStop = new JButton ("STOP"); buttonStop.setEnabled (false); buttonStart.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(processocronometro.isAlive()){ processocronometro.resume(); }else{ processocronometro.start(); } buttonStart.setEnabled (false); buttonStop.setEnabled (true); }}); buttonStop.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub processocronometro.suspend(); buttonStart.setEnabled (true); buttonStop.setEnabled (false); }}); JPanel panelButtons = new JPanel (new GridLayout (1, 2)); panelButtons.add (buttonStart); panelButtons.add (buttonStop); finestracronometro.add (labelTime, BorderLayout.CENTER); finestracronometro.add (panelButtons, BorderLayout.SOUTH); 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:
if(pulsante.equals(this.cronometro)){ creafinestra(); this.cronometro.setEnabled(false); this.finecronometro.setEnabled(true); }
qui è dove chiudo la finestra e quindi anche il thread:
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'actionlistenermetto solo gli attributi che servono )
private JButton fineorologio; private OraBari orarioattuale = new OraBari(); private JButton orologio; private Thread processorologio = new Thread(orarioattuale); private JButton cronometro; private JButton finecronometro; private JButton agenda; private JButton fineagenda; private JFrame finestracronometro = new JFrame("Cronometro"); private JLabel labelTime = new JLabel ("0:00:00.0");
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!
aaa