簡體   English   中英

如何在多圈動畫中使用多線程?

[英]How to use multiple thread for multiple circle animation?

我已經繪制了多個圓圈,並且希望它們使用不同的線程同時向右移動。 所以我必須使用多個線程。 但是,當我運行該程序時,它會一次又一次地重新繪制圓圈。 我實際上知道問題出在哪里,但我不知道如何解決。 這是我的代碼:

Circles.java:

import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.JPanel;



public class Circles extends JPanel {
    private int x,y,r,s;
    private Color c;
    private Random ran;

    public Circles() {
        // TODO Auto-generated constructor stub
        ran = new Random();
        x = ran.nextInt(600)+5;
        y = ran.nextInt(600)+5;
        r = ran.nextInt(100)+20;
        s = ran.nextInt(10)+5;
        c = new Color(ran.nextInt(255),ran.nextInt(255),ran.nextInt(255));
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public int getR() {
        return r;
    }

    public Color getC() {
        return c;
    }
    public int getS() {
        return s;
    }

    public void move(int speed) {
        x = x+speed;
    }
}

Game.java:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.JFrame;

public class Game extends JFrame implements Runnable {
    private static Circles myCircle;
    private static int numberOfCircle;
    private Random ran;
    private static ArrayList<Circles> circleList = new ArrayList<>();

    public Game() {
        // TODO Auto-generated constructor stub

        setLayout(new BorderLayout());
        setVisible(true);
        setSize(700,700);
        setTitle("Game");
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Thread t = new Thread(this);
        t.start();
        System.out.println(t.getName());
    }

    @Override
    public void paint(Graphics g) {
        // TODO Auto-generated method stub
        super.paint(g);
        for(int i=0; i<numberOfCircle; i++) {
            myCircle = new Circles();
            g.setColor(myCircle.getC());
            g.fillOval(myCircle.getX(), myCircle.getY(), myCircle.getR(), myCircle.getR());
            circleList.add(myCircle);
        }

    }

    public static void main(String[] args) {
        Game game = new Game(); 
        numberOfCircle = Integer.parseInt(args[0]);
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(true) {
            try {
                Thread.currentThread().sleep(100);
                for(int i=0; i<numberOfCircle; i++) {
                    myCircle.move(circleList.get(i).getS());
                }
                repaint();
            } catch (Exception e) {
                // TODO: handle exception
                System.out.println(e.getMessage());
            }
        }

    }

}

有什么建議嗎?

每次您調用paint時,您都會在paint方法內一次又一次地創建新的圓,在paint之外對某個init方法進行初始化,

 @Override
public void paint(Graphics g) {

    super.paint(g);
    for (Circles myCircle:circleList
         ) {
        g.setColor(myCircle.getC());
        g.fillOval(myCircle.getX(), myCircle.getY(), myCircle.getR(), myCircle.getR());
    }
}

public static void main(String[] args) {
    Game game = new Game(); 
    numberOfCircle = 5;

    for(int i=0; i<numberOfCircle; i++) {
        myCircle = new Circles();
        circleList.add(myCircle);
    }

}

@Override
public void run() {
    while(true) {
        try {
            Thread.currentThread().sleep(100);
            for (Circles myCircle:circleList
                 ) {
                myCircle.move(myCircle.getS());
            }
            repaint();
        } catch (Exception e) {
            // TODO: handle exception
            System.out.println(e.getMessage());
        }
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM