2013-01-11 1 views
-1

Les fonctions de mes classes ont fonctionné après avoir été testées. Le ColorDrop crée une chute de couleur spécifiée. Le SpeedDrop de la vitesse spécifiée et ainsi de suite. Je veux mettre mes gouttes dans une liste une masse les produire dans l'interface graphique. Drop est la super-classe, ColorDrop et SpeedDrop sont des sous-classes qui étendent la super-classe. Le code compile, mais l'interface graphique est vide. Suis-je mal mon arraylist? Ou est-ce que j'appelle incorrectement des méthodes sur des objets de cette liste?Arraylist de type superclasse pour contenir divers types de sous-classes

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

Vous n'avez pas besoin de lancer 'Drop' quand vous ajoutez à la liste, puisque tous les éléments que vous ajoutez en héritent – fge

+0

cela ne fonctionne pas sans le cast: \ –

+0

La conversion en' Drop' est complètement inutile. – Yuushi

Répondre

0

Cette ligne:

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

Votre essayant d'obtenir un objet de la même position que vous essayez de l'ajouter à (i), et appelant randomPainter() sur ce (encore objet null) entraînera un NPE.

Comme mentionné dans les commentaires, vérifiez vos boucles for dans les méthodes de mise à jour et dessiner pour i <= 12, qui devrait être i < 12, ou mieux, i < drops.size(). Cela entraînera actuellement des erreurs ArrayIndexOutOfBounds.

+0

j'ai corrigé les boucles for et suis en train de fixer mon. il peint maintenant mais ils ne bougent pas correctement je vais mettre à jour mon code dans le post pour montrer que mon ajout inclue maintenant l'index –

+0

Va avoir besoin d'un peu plus d'informations. Comment ne bougent-ils pas correctement? Que font-ils?La publication de votre méthode de déplacement vous aidera également, mais si votre test tombe en panne, il ne semble pas y avoir de raison pour que vos boucles ne fonctionnent pas, mis à part le fait que vous les construisez avec des paramètres différents. – AerusDar

+0

J'ai testé mon code et il semble que la fonction fillDropList est appelée mais les dorps ne sont pas ajoutés? C'est étrange parce que je ne reçois pas un pointeur nul, mais quand je mets une ligne de test System.out.println ("je fais des gouttes!") Sous l'un des ajouts rien n'est imprimé .. –

0

Très bien, regardons quelques choses petit à petit. Voyant que vous utilisez AWT avec Graphics2D, je vais supposer que vous utilisez JPanel ou quelque chose du genre. Si tel est le cas, alors je vais aussi supposer que votre

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

est à un moment donné d'être appelé par certains

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

quelque part dans votre classe Goo. En outre, votre méthode de mise à jour, je suppose, est appelée à plusieurs reprises dans un thread. Une chose qui il manque qui serait probablement corriger l'interface graphique ne pas être mise à jour serait l'ajout d'un appel repaint() comme si

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

Quant à vos boucles for, puisque vous utilisez un ArrayList au lieu d'un tableau, ne pas utilisez des valeurs codées en dur pour la taille dans tout le code, car cela va à l'encontre de l'objectif d'utilisation d'une liste.

/** 
* 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))); 
     } 
    } 
} 

et partout où vous avez une boucle for itérer gouttes, utilisez

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

Seulement d'autres choses que je peux recommander est considérer le modèle de stratégie pour vos différents types Drop, et regardez votre parenthèse.

Questions connexes