我遇到了一个简单的动画程序(是的,这是家庭作业)。这个问题要求我们在500X500窗口上随机创建100个粒子类对象,然后使用摇摆计时器移动它们。这是我遇到的问题,创建的粒子似乎不是随机的,但是它们沿着对角轴排列,我很难找到逻辑错误,非常感谢你的帮助。这是一个应该清楚的屏幕截图。 http://i57.tinypic.com/qswbix.jpg
如果有人发现我的问题难以理解,我也会在帖子末尾发布作业问题。谢谢你的帮助
public class ParticleFieldWithTimer extends JPanel{
private ArrayList<Particle> particle = new ArrayList<Particle>();
Timer timer;
boolean b;
public ParticleFieldWithTimer (){
this.setPreferredSize(new Dimension(500,500));
for(int i = 0; i < 100; i++) {
particle.add(new Particle());
}
timer = new Timer(40, new ActionListener()
{
@Override
public void actionPerformed(ActionEvent ae) {
for (Particle p : particle) {
p.move();
}
repaint();
}
});
timer.start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setColor(Color.RED);
for (Particle p : particle) {
double temp1 = p.getX();
double temp2 = p.getX();
int tempX = (int) temp1;
int tempY = (int) temp2;
g2.fillRect(tempX, tempY, 3, 3);
}
}
public static void main(String[] args) {
final JFrame f = new JFrame("ParticleField");
final ParticleFieldWithTimer bb = new ParticleFieldWithTimer();
f.setLayout(new FlowLayout());
f.add(bb);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
try {
bb.finalize();
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
f.dispose();
}
});
f.pack();
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
这是粒子类
public class Particle {
private int x , y ;
Random r = new Random();
public Particle () {
x = r.nextInt(500);
y = r.nextInt(500);
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public void move() {
x += r.nextBoolean() ? 1 : - 1;
y += r.nextBoolean() ? 1 : - 1;
System.out.println("x : " + x+" y: " + y);
}
}
创建一个具有两个双字段x和y的粒子,a 构造函数,将这些字段初始化为0之间的随机值 500,返回值的方法getX和getY,以及方法 void move()随机地为每个值添加或减去一个 x和y。 (添加到x和y的数量是两个单独的随机数 数字。)接下来,创建一个扩展的类ParticleFieldWithTimer JPanel的。此类应该更喜欢500 * 500像素的大小。它的 构造函数应首先使用100填充ArrayList字段 粒子对象,然后启动一个滴答25次的Swing Timer 第二。在每个tick,动作监听器应首先调用该方法 移动每个粒子,然后调用重绘。 paintComponent ParticleFieldWithTimer的方法应该将每个粒子绘制为3 * 3 矩形到它的当前坐标。
答案 0 :(得分:3)
在paintComponent
方法中,
替换
double temp2 = p.getX();
与
double temp2 = p.getY();
祝你好运。