Oppure

Loading
16/06/10 15:23
GhezaSh
Ciao, oggi ho cercato di sviluppare un Timer in Java, prima l'ho fatto a console e andava benissimo poi l'ho rifatto con la GUI e li iniziano i problemi!
In pratica al posto di inserire nella label ogni secondo un numero diverso che va da 0 a 10 aspetta 10 secondi e mette appunto subito il 10.

Vi lascio il codice
import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

public class JTimer extends JFrame{
	private JPanel pannello;
	private JButton bottone;
	public JLabel time;
	JTimer(int secondi){
		super("JTimer");
		AscoltaEventi ae = new AscoltaEventi();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(500,500);
		pannello = new JPanel();
		pannello.setSize(500,500);
		pannello.setLayout(null);
		add(pannello);
		setVisible(true);
		
		bottone = new JButton("Start");
		bottone.setBounds(225,200,50,50);
		bottone.addActionListener(ae);
		pannello.add(bottone);
		time = new JLabel();
		time.setBounds(10,10,200,200);
		pannello.add(time);
		
	}


	public class AscoltaEventi implements ActionListener{

		
		public void actionPerformed(ActionEvent e) {
			String pressione = e.getActionCommand();
			if(pressione.equals("Start")){
				Timer(10);
			}
		}
		

		public void Timer(int tempo){
				int i = 0;
				while(i <= tempo ){
					try{
					Thread.sleep(1000);
					}catch(InterruptedException e){
						e.printStackTrace();
					}
					time.setText(""+i);
					i++;
				}
			}
		}
		public static void main(String[] args) {
			JTimer prova = new JTimer(10);
		}



}


Attendo risposta, grazie.
aaa
03/07/10 13:04
tekdu
il problema è che quando viene richiamato il metodo timer(tempo) l'applicazione rimane "impegnata" a svolgere le relative operazioni.
per poter visualizzare sulla gui l'aggiornamento del timer devi far eseguire timer(tempo) ad un thread, ad esempio così:
public  class AscoltaEventi implements  ActionListener,Runnable{
private int tempo;

        public void actionPerformed(ActionEvent e) {
            String pressione = e.getActionCommand();
            if(pressione.equals("Start")){
                Timer(10);
            }
        }
        
        public void run(){
                int i = 0;
                while(i <= tempo ){
                    try{
                    Thread.sleep(1000);
                    }catch(InterruptedException e){
                        e.printStackTrace();
                    }
                    time.setText(""+i);
                    i++;
                }

        }

        public void Timer(int tempo){
                this.tempo=tempo;
                new Thread(this).start();
            }
        } 


così dovrebbe funzionare...
aaa