gpt4 book ai didi

java - 如何使用多线程进行多圆动画?

转载 作者:行者123 更新时间:2023-11-30 02:18:44 25 4
gpt4 key购买 nike

我已经画了多个圆圈,我希望它们用不同的线程同时向右移动。所以我必须使用多线程。然而,当我运行该程序时,它一次又一次地重新绘制圆圈。其实我知道问题出在哪里,但不知道如何解决。这是我的代码:

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());
}
}

}

关于java - 如何使用多线程进行多圆动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47518577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com