Oppure

Loading
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
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'actionlistener:(metto 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! :alert:
aaa
09/11/15 18:53
pierotofy
private long startTime;       
       @Override
        public void run() {
            startTime = System.currentTimeMillis ();
        }
Il mio blog: piero.dev