java простая анимация с потоками

Я хочу создать простую 2D-анимацию с помощью потока. После запуска потока у меня возникают проблемы с определением, что именно добавить в метод запуска. Прямо сейчас объекты класса Particle нарисованы на кадре, но анимации нет. Также я мог бы использовать вашу помощь в том, как закрыть поток, когда пользователь закрывает фрейм.

public class ParticleFieldWithThread extends JPanel implements Runnable{
private ArrayList<Particle> particle = new ArrayList<Particle>();

boolean runnable; 
public ParticleFieldWithThread (){
    this.setPreferredSize(new Dimension(500,500));


    for(int i = 0; i < 100; i++) { 
        particle.add(new Particle());
    }
    Thread t1 = new Thread();
    t1.start();




}
public void run () {
    while (true ) {
        try {
            Thread.sleep(40);
            for (Particle p : particle) {                   
                p.move();                   

            }
            repaint();

        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        }


    }



   public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        g2.setColor(Color.RED);

        for (Particle p : particle) {
            g2.fill(new Rectangle2D.Double(p.getX(), p.getY(), 3, 3));
        }           

    }
   public static void main(String[] args) {
        final JFrame f = new JFrame("ParticleField");
        final ParticleFieldWithThread bb = new ParticleFieldWithThread();
        f.setLayout(new FlowLayout());
        f.add(bb);

        f.pack();
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

Вот класс частиц

public class Particle {
private double x , y ;

Random r = new Random();

public Particle () {

    x = r.nextDouble()*500;
    y = r.nextDouble()*500;

}
public double getX() {

    return x;
}
public double getY() {
    return y;
}
public void move() {

    x += r.nextBoolean() ? 1 : - 1;
    y += r.nextBoolean() ? 1 : - 1;
    //System.out.println("x : " + x+" y: " + y);
}



}

person user3363135    schedule 14.03.2014    source источник


Ответы (1)


Это ничего не дает:

Thread t1 = new Thread();
t1.start();

Вам нужно передать Runnable (в вашем коде это будет текущий объект класса this) в конструктор Thread, чтобы он имел какое-либо значение или функцию. т.е.

Thread t1 = new Thread(this);
t1.start();

За свои деньги я бы сделал что-то совершенно другое и использовал бы Swing Timer для простой анимации Swing.

person Hovercraft Full Of Eels    schedule 14.03.2014