-1

我的课程中的功能经过测试后已经工作。ColorDrop 创建指定颜色的下降滴。指定速度的 SpeedDrop 等等。我想将我的水滴放在一个列表中,然后在 GUI 中批量生产它们。Drop 是超类,ColorDrop 和 SpeedDrop 是扩展超类的子类。代码编译,但 GUI 是空白的。我组装我的arraylist错了吗?还是我错误地调用了该列表对象的方法?

   package advancedobject;

import java.awt.Color;
import java.awt.Graphics2D;
import java.util.ArrayList;

public class MyGooDrop extends Goo {

    Drop testDrop;
    Drop colorDrop;
    Drop fastDrop;
    Drop wavyDrop;
    int random = (int) Math.random()*width; 
    ArrayList<Drop> drops;
    public MyGooDrop() 
    {

        testDrop = new Drop(width/2, -10, 10);
        colorDrop =  new ColorDrop(width/3, -10, 10, Color.BLUE);
        fastDrop = new SpeedDrop ( (width * 3/4), -10, 10, 5);
        wavyDrop = new WavyDrop (-10, height/2, 10);
        drops = new ArrayList<Drop>();
        fillDropList();
    }

      public void fillDropList ()
    {
        for(int i = 0; i<= 12; i++)
        {
           if (i <= 4)
           drops.add(i, new Drop ((int) Math.random()*width, -10, 10));
           else if (i>4 && i<=8)
           drops.add(i, new ColorDrop ((int) Math.random()*width, -10, 10, Color.BLUE)); //drops.get(i).randomPainter()
           else
           drops.add(i, new SpeedDrop ((int) Math.random()*width, -10, 10, (int) Math.random()*10));
        }
    }

    public void draw(Graphics2D g) {

        // Fill background 
        g.setColor(Color.GRAY);
        g.fillRect(0, 0, width, height);

        testDrop.draw(g);
        colorDrop.draw(g);
        fastDrop.draw(g);
        wavyDrop.draw(g);
      for(int i = 0; i<=12; i++)
       drops.get(i).draw(g);
    }

    public void update(){

        testDrop.move(width, height);
        colorDrop.move(width, height);
        fastDrop.move(width, height);
        wavyDrop.move(width, height);
        for(int i = 0; i<=12; i++)
        drops.get(i).move(width, height);
    }

    public static void main(String[] args) {

        MyGooDrop tester = new MyGooDrop();
        tester.go();

    }
}
4

2 回答 2

0

好吧,让我们一点一点地看一些东西。看到您将 AWT 与 Graphics2D 一起使用,我将假设您正在使用 JPanel 或类似的东西。如果是这种情况,那么我也将假设您的

public void draw(Graphics2D g) {
   ...
}

在某个时候被某些人调用

@Override
public void paint(Graphics g) {
   draw((Graphics2D)g);
}

在你的 Goo 班的某个地方。另外,我假设您的更新方法在线程中被重复调用。它缺少的一件事可能会修复未更新的 GUI 将添加repaint()这样的调用

public void update(){

    testDrop.move(width, height);
    colorDrop.move(width, height);
    fastDrop.move(width, height);
    wavyDrop.move(width, height);
    for(int i = 0; i<=12; i++)
        drops.get(i).move(width, height);
    //updates the GUI
    repaint();
}

至于你的 for 循环,因为你使用的是 ArrayList 而不是 Array,所以不要在整个代码中使用硬编码的大小值,因为这违背了使用 List 的目的。

/**
 * Adds a bunch of new drops to the drop list, a third of each type
 * @param numOfDrops - the amount of drops to add to the list
 */
public void fillDropList (int numOfDrops)
{
    int oneThird = numOfDrops/3;
    int twoThirds = 2*numOfDrops;
    for(int i = 0; i<= numOfDrops; i++)
    {
        if (i <= oneThird)
        {
            drops.add(new Drop ((int)(Math.random()*width), -10, 10));
        }
        else if (i > oneThird && i <= twoThirds)
        {
            drops.add(new ColorDrop ((int)(Math.random()*width), -10, 10, Color.BLUE));
        }
        else
        {
             drops.add(new SpeedDrop ((int)(Math.random()*width), -10, 10, (int)(Math.random()*10)));
        }
    }
}

在任何地方都有 for 循环遍历 drop,使用

for (int i = 0; i < drops.size(); i++)

我唯一可以推荐的其他事情是考虑您不同掉落类型的策略模式,并注意您的括号。

于 2013-01-11T03:32:40.687 回答
0

这一行:

drops.add(new ColorDrop ((int) Math.random()*width, -10, 10, drops.get(i).randomPainter()));

您尝试从与尝试将其添加到 (i) 的位置相同的位置获取对象,并在此(仍然为空对象)上调用 randomPainter() 将导致 NPE。

正如评论中提到的,检查你的 for 循环在 update 和 draw 方法中i <= 12,应该是i < 12,或者更好,i < drops.size()。这些当前将导致 ArrayIndexOutOfBounds 错误。

于 2013-01-11T02:37:20.923 回答