repaint() nie chce rysować

0

Może mi ktoś wyjaśnić co tu się tak naprawdę dzieje w tym kodzie?

Po pierwsze zauważyłem że nie wiem czemu obiekt JSpinner nie pojawia się w panelu od razu, tylko dopiero jak zmienię myszką rozmiar okna to się rysuje. Pomyślałem że wykorzystam metodę repaint() ale tu jeszcze bardziej się pomotałem.
Chciałem aby odświeżało ramkę co sekundę dodatkowo w 7 sekundzie narysowało button. Ale tak się nie dzieje. Nie wiem czemu.
Komunikat "wątek" działa co sekundę ale razem z nim powinno sie pojawiać "odrysowano", ale to pojawia się co sekundę dopiero od kiedy pierwszy raz zmienie rozmiar ramki myszką. To samo z buttonem nie pojawia się sam tylko trzeba zmienić rozmiar.
Może ktoś mi to wyjaśnić?

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

public class TestRepaint extends JFrame
{
	SpinnerNumberModel model1 = new SpinnerNumberModel(0, 0, 60, 1);
	JSpinner spinner, spinner2;
	MyPanel panel;
	int a=0;
	TestRepaint()
	{
		
		setVisible(true);
		setSize(300, 300);
		panel = new MyPanel();
		panel.add(new JLabel("asd"));
		spinner = new JSpinner(model1);
		spinner2 = new JSpinner(model1);
		panel.add(spinner);

		add(panel);
		Thread wątek = new Thread(new Runnable()
		{

			@Override
			public void run()
			{
				// TODO Auto-generated method stub
				while (true)
				{
					a++;
					if (a==7)
						panel.add(new JButton("asd"));
						
					try
					{
						Thread.sleep(1000);
					} catch (InterruptedException e)
					{
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					System.out.println("wątek");
					panel.repaint();
				}
			}
		});
		wątek.start();
	}

	class MyPanel extends JPanel
	{
		MyPanel()
		{
			super();
		}

		public void paintComponent(Graphics g)
		{
			super.paintComponent(g);
			System.out.println("odrysowano");
		}
	}
	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		TestRepaint app = new TestRepaint();
		app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

}

dodanie tagu "java" - fp

0

Bo najpierw zrobiłeś okienko visible a potem coś do niego dodałeś i nie zrobiłeś żadnego valiadate() ani pack() na końcu toteż te dodane elementy się nie odrysowały.

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