-1

私のクラスの関数は、テストされた後に機能しました。ColorDropは、指定された色の落下ドロップを作成します。指定された速度のSpeedDropなど。ドロップをリストに入れて、GUIで大量生産したいと思います。Dropはスーパークラスであり、ColorDropとSpeedDropはスーパークラスを拡張するサブクラスです。コードはコンパイルされますが、GUIは空白です。配列リストの組み立てが間違っていますか?または、そのリストのオブジェクトのメソッドを誤って呼び出していますか?

   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

この行:

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

オブジェクトを(i)に追加しようとしているのと同じ位置からオブジェクトを取得しようとし、これに対してrandomPainter()を呼び出すと(まだnullオブジェクト)、NPEが発生します。

コメントで述べたように、のupdateメソッドとdrawメソッドのforループを確認してください。これは、、またはそれ以上i <= 12である必要があります。これらは現在、ArrayIndexOutOfBoundsエラーを引き起こします。i < 12i < drops.size()

于 2013-01-11T02:37:20.923 に答える
0

さて、少しずついくつかのことを見てみましょう。Graphics2DでAWTを使用していることを確認して、JPanelなどを使用していると仮定します。これが事実である場合、私はまたあなたを仮定するつもりです

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

ある時点で誰かによって呼び出されています

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

Gooクラスのどこか。また、あなたのupdateメソッドは、スレッド内で繰り返し呼び出されていると思います。GUIが更新されないことを修正する可能性のある欠落していることの1つは、その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を使用しているため、コード全体のサイズにハードコードされた値を使用しないでください。リストを使用する目的が損なわれるためです。

/**
 * 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++)

私がお勧めできる他の唯一のことは、さまざまなドロップタイプの戦略パターンを検討し、括弧を監視することです。

于 2013-01-11T03:32:40.687 に答える