我的课程中的各种功能在测试后都有效。 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();
}
}
答案 0 :(得分:0)
这一行:
drops.add(new ColorDrop ((int) Math.random()*width, -10, 10, drops.get(i).randomPainter()));
你试图从同一个位置获取一个对象,试图将它添加到(i),并在此(仍为空的对象)上调用randomPainter()将导致NPE。
正如评论中所述,请检查更新中的for循环并绘制i <= 12
的方法,i < 12
或更好,i < drops.size()
。这些将导致ArrayIndexOutOfBounds错误。
答案 1 :(得分: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循环迭代滴,使用
for (int i = 0; i < drops.size(); i++)
我可以推荐的其他事情是考虑不同Drop类型的策略模式,并注意你的括号。