Animacja w Javie

0

Chciałbym napisać prostą animację w Javie - powiedzmy kulkę, która będzie się odbijała od ścian okna. I teraz mam takie pytanie:

  1. Będę używać metody paint(). Jeżeli w niej będzie w pętli chodziła animacja, to program chyba zawiesi się, bo nigdy nie wyjdzie z metody paint(), a ja chciałbym, żeby dawało się zmieniać w trakcie działania - rozmiar okna itp. Jak więc rozlokować generowanie obrazu, aby program się nie wieszał?
0

Możesz skorzystać z Timer'ów lub 2. wątku.

0

Timer/dodatkowy wątek powinny wykonywać regularnie metodę repaint() (nie paint).

0

Jestem bardzo, ale to bardzo, bardzo, bardzo :P początkujący, jeżeli chodzi o wątki. Dlatego proszę o pomoc:

  1. Jak za pomocą wątku sprawić, by w JFrame animowało kuleczkę?

Mam taki kod:

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;


public class Animacja extends JFrame
{
	public Animacja()
	{
		setBounds(0, 0, 600, 600);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		new Animacja();
	}
	
	public void paint(Graphics g)
	{
		while (true)
			for (int i = 0; i < 500; i++)
			{
				g.setColor(Color.white);
				g.fillRect(0, 0, getWidth(), getHeight());
				g.setColor(Color.black);
				g.fillOval(i, i, 10, 10);
				try {
					Thread.sleep(5);
				}
				catch (Exception e) {
					System.out.println("Wyjątek!");
				}
			}
		
	}
}

Tutaj problem polega na tym, że animacja blokuje cały program - nie da się do zamknąć inaczej, niż przez Alt+Ctrl+Del

0

To więc poczytaj o wątkach i Timer'ach, np.:
Wątki
Klasa Timer

0

Przeczytałem o wątkach ze swojej książki, jak i przejrzałem strony, które podałeś, jednak nie ma ani tu, ani tu informacji, jak wykorzystać wątki do wykonywania wspólnego zadania. Wiem, że trzeba albo implementować interfejs Runnable, albo rozszerzyć klasę Thread, a następnie zaimplementować metodę run(). Jednak nie wiem jak użyć wątku do tego, by animować kulkę.

0

To powinno załatwić problem zamykania okna

Animacja frame =  new Animacja();
frame.pack();//mozesz to dodac
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//zamykanie okna zamyka program
0

Ok, napisałem już program z wątkiem:

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;

public class Animacja extends JFrame
{
	public Animacja()
	{
		setBounds(0, 0, 600, 600);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		new Watek(getGraphics(), this);
	}
	
	public static void main(String[] args) {
		new Animacja();
	}
	
	public void paint(Graphics g)
	{
	}
}
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;


public class Watek implements Runnable{
	Graphics g;
	JFrame f;
	
	public Watek(Graphics gr, JFrame fr)
	{
		g = gr;
		f = fr;
		(new Thread(this, "F")).start();
	}
	
	public void run()
	{
		while (true)
			for (int i = 0; i < 500; i++)
			{
				g.setColor(Color.white);
				g.fillRect(0, 0, f.getWidth(), f.getHeight());
				g.setColor(Color.black);
				g.fillOval(i, i, 10, 10);
				try {
					Thread.sleep(5);
				}
				catch (Exception e) {
					System.out.println("Wyjątek!");
				}
			}
		
	}
}
 
0

Rysujesz w złym wątku. Wątek powinien wykonywać jedynie repaint().
Porównaj płynność animacji.
Dodatkowo użyłem JPanel, gdyż zapewnia to double buffering.

import java.awt.Color;
import java.awt.Graphics;
 
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class Animacja extends JFrame
{
        private static class AnimacjaPanel extends JPanel {
       	int i;
 
        	public void paintComponent(Graphics g)
       	 {
         	   super.paintComponent(g);
         	   g.setColor(Color.black);
         	   g.fillOval(i, i, 10, 10);
         	   if (i >=500) { i = 0; } else {i++;};
       	 }
        }

        public Animacja()
        {
		setBounds(0, 0, 600, 600);
		AnimacjaPanel panel = new AnimacjaPanel();
		add(panel);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		new Watek(panel);
        }
 
        public static void main(String[] args) {
                new Animacja();
        } 
}
import java.awt.Component;
 
public class Watek implements Runnable{
        private final Component c;
 
        public Watek(Component c)
        {
                this.c = c;
                (new Thread(this, "F")).start();
        }
 
        public void run()
        {
              while (true) {
                 c.repaint();
                 try {
                          Thread.sleep(5);
                   }
                  catch (Exception e) {
                          System.out.println("Wyjątek!");
                   }
		}
        }
}
0

Dzięki!

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