odświeżanie Jlabel oraz opóźnienia za pomocą Java Swing Timer

0

Witam, zaczynam uczyć się Javy i chciałem napisać prosty program który będzie wyświetlał co sekundę liczby od 0 do 9 w Jlabel. Niestety po kliknięciu przycisku start program czeka 10 sec i w Jlabel wyświetla 9. Jak zrobić żeby Jlabel na bieżąco się odświerzał? Z góry dziękuję za pomoc. Mój kod:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;


public class main extends JFrame implements ActionListener 
{
	private JButton klik;
	private JLabel label;
	private Timer time;
	public main()
	{
		setSize(300,200);
		setTitle("Odliczanie");
		setLayout(null);
		
		klik = new JButton("Strat");
		klik.setBounds(100,100,80,20);
		add(klik);
		klik.addActionListener(this);
		
		label = new JLabel("");
		label.setBounds(100,50,100,20);
		add(label);
		
		 time = new Timer(1000, new ActionListener() 
		 {
	          public void actionPerformed(ActionEvent e) 
	          {
	        	  for (int i = 0 ; i < 10 ; i++ )
	              {
	            	  label.setText(String.valueOf(i));  
	            	  label.repaint();
	            	  repaint();
	              }
	          }
	       });
	}
	public static void main(String[] args) 
	{
		main nazwa = new main();
		nazwa.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		nazwa.setVisible(true);

	}
	@Override
	public void actionPerformed(ActionEvent e)
	{
		 time.start();		
	}
}
0

Po co Ci Action Listener przy Time? Robisz nowy wątek, który wypisuje bieżącą liczbę ( i w pętli for(;;) u Ciebie ) i kończysz wypisanie znaku metodą Sleep()/bądź sleep() klasy Thread. Enjoy

1

Kod timera wykonuje sie automatycznie co sekundę. W tym kodzie zatem nie powinno już być żadnej pętli.

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;
 
 
public class main extends JFrame implements ActionListener 
{
    private JButton klik;
    private JLabel label;
    private Timer time;
    private int counter = 0;
    public main()
    {
        setSize(300,200);
        setTitle("Odliczanie");
        setLayout(null);
 
        klik = new JButton("Start");
        klik.setBounds(100,100,80,20);
        add(klik);
        klik.addActionListener(this);
 
        label = new JLabel("");
        label.setBounds(100,50,100,20);
        add(label);
 
        time = new Timer(1000, new ActionListener() 
        {
            public void actionPerformed(ActionEvent e) 
            {
                label.setText(String.valueOf(counter));  
                counter++;
                if(counter == 10)
                {
                    time.stop();
                }
            }
        });   
    }
    public static void main(String[] args) 
    {
        main nazwa = new main();
        nazwa.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        nazwa.setVisible(true);
 
    }
    @Override
    public void actionPerformed(ActionEvent e)
    {
         counter = 0;
         time.start();        
    }
}
0

Dzięki wielkie za pomoc, wszystko działa jak powinno :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1