Opoznienie w programie

0

Witajcie, mam pewien problem z programem, ktory co okreslony czas powinien rysowac cos na moim panelu, mianowicie kod:

import java.awt.*;
import javax.swing.*;

public class test3
{
    public static void main(String[] args) 
    {
    	EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
            	MojaRamka ramka = new MojaRamka();
            }
        });
    }        
}
 
class MojaRamka extends JFrame 
{ 
    public MojaRamka()
    {           
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setSize(500, 500);
        
        MojPanel a = new MojPanel();
        a.setPreferredSize(new Dimension(500,500));
        add(a);
    }

}

class MojPanel extends JPanel
{
	public void paintComponent(Graphics g)
    {
	    try
	    {
		    for(int i = 0; i< 10; i++)
		    {
			    g.drawString("" + i, 30 * i, 30 * i);
			    Thread.sleep(1000);
		    }
	    }
	    catch(InterruptedException e)
	    {
	    	
	    }
	}	
}  

nie działa tak jak oczekuję, na początku jest opóźnienie, potem jednak dopiero wszystko się ładuje, jednak w jednym momencie, a nie tak jak chcę, z sekundowym opóźnieniem, dlaczego? jak zrobić, żeby każda kolejna cyfra wyświetlana była co ~1000 ms?

1

W metodzie paintComponent nie powinieneś usypiać wątku z wielu powodów. Wszystko ładuje się po 10s dlatego, że metoda musi najpierw się zakończyć, żeby można było ten panel odrysować. W paintComponent zostaw tylko linijkę g.drawString("" + i, 30 * i, 30 * i);, z i zrób pole klasy, a pętlę wstaw w osobny wątek, który co 1000ms będzie inkrementował i.

1

Może to cie naprowadzi...

public class Main {

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {

            public void run() {
                MojaRamka ramka = new MojaRamka();
            }
        });
    }
}

class MojaRamka extends JFrame {

    public MojaRamka() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setSize(500, 500);

        MojPanel a = new MojPanel();
        //    a.run();
        a.setPreferredSize(new Dimension(500, 500));
        add(a);

    }
}

class MojPanel extends JPanel implements Runnable {

    int step = 1;

    public void paintComponent(Graphics g) {

        g.drawString("" + step, 10 * step, 10 * step);
        this.run();

    }

    public void run() {
        //for (int i = 0; i < 5; i++) {
        if (step < 20) {
            step++;
            try {
                Thread.sleep(50);
            } catch (InterruptedException ie) {
            }
            repaint();
        }
    }
}
 
0

Prościej można to zrobić przy użyciu Timera.

0

dziękuje wszystkim, z wątkiem sobie poradziłem, jednak mam nowy problem, mianowicie panel zaczął mi się nieco przesuwać, gdy dodałem przycisk, oto mój kod:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;
import javax.swing.*;

public class test3 
{
    public static void main(String[] args) 
    {
    	EventQueue.invokeLater(new Runnable() 
		{
			public void run() 
			{
			    MojaRamka ramka = new MojaRamka();
		    }
	    });
    }
}
 
class MojaRamka extends JFrame 
{
	public MojaRamka() 
	{
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		setSize(500, 500);		 
	
		glowny.setPreferredSize(new Dimension(500, 500));
		add(glowny);

		glowny.add(buton);		
		
		a.setPreferredSize(new Dimension(500, 500));
		glowny.add(a);
		
		akcjaStart.setPreferredSize(new Dimension(500, 500));
		
        buton.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent evet)
            {
                glowny.remove(a);
                glowny.add(akcjaStart);
                glowny.revalidate();
                glowny.repaint();
            }
        }); 	
	}
	private JPanel glowny = new JPanel();
	private JButton buton = new JButton("GO!");
	private MojPanel a = new MojPanel();
	private akcjaPrzyciskStart akcjaStart = new akcjaPrzyciskStart();
}

class akcjaPrzyciskStart extends JPanel implements Runnable
{
	int step = 1;
	public void paintComponent(Graphics g) 
	{
        Graphics2D g2 = (Graphics2D) g;      
	    Rectangle2D kwadrat = new Rectangle2D.Double(10, 10, 10 * step, 10 * step);
	    g2.draw(kwadrat);	
		this.run(); 
	} 
	public void run() 
	{
		if (step < 10) 
		{
			step++;
			try 
			{
				Thread.sleep(100);
			} 
			catch (InterruptedException ie) 
			{
				
			}
			repaint();
		}
	}
}

class MojPanel extends JPanel
{ 
	public void paintComponent(Graphics g) 
	{
        Graphics2D g2 = (Graphics2D) g;      
	    Rectangle2D kwadrat = new Rectangle2D.Double(10, 10, 10, 10);
	    g2.draw(kwadrat);
	} 
}      

kompletnie nie wiem dlaczego...
button się dubluje...
proszę o pomoc

0

Ja to się nie dziwię dlaczego ci się wszystko rozjeżdża...

Zapomniałeś o LayoutManager.

Musisz jakoś rozstawić te kmponenty...Samo się nie zrobi...

Pozdr.

0

niestety, ustawienie layouta nie pomaga
mnie ciekawi jedno, dlaczego, jak nie tworzę nowego wątku to jest ok, a jak ten nowy wątek jest tworzony, to się wszystko sypie?

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