2013-10-15 3 views
0

Я новичок в java, поэтому, пожалуйста, извините мою простоту. Как мне вызвать объект внутри другого объекта в этом случае GCompound. В приведенном ниже коде я хочу, чтобы «пламя» мигало. Но это не похоже на метод run.Доступ и объявление объектов в других объектах

import java.awt.Color; 
import acm.graphics.*; 
import acm.program.*; 

public class BuildTower extends GraphicsProgram { 

    GCompound Ekulobia; 
    GCompound Dike_na_fia; 
    GCompound Uli; 
    GCompound Aniche; 
    GCompound Achebe; 
    GCompound Akuwanta; 
    GCompound Ogbunike; 
    GCompound Obinohia; 
    GCompound Aguata; 

    private GCompound[] name = { Aguata, Ekulobia, Dike_na_fia, Uli, Aniche, Achebe, Akuwanta, Ogbunike, Obinohia } ; 

    public void run() { 
     setSize(800,300); 
     GLabel towerName; 

     for(int i = 0; i <= 8; i++) { 
      towerName = new GLabel (nameTower(i)); 
      towerName.setFont("Times-12"); 
      name[i] = new erectTower(towerName); 
      add(name[i],50 + i * 80,100); 
     } 

     for(int i = 0; i <= 8; i++) { 
      name[i].flame.setFilled(true); /*cannot access flame in erecttower method*/ 
      pause (500); 
      name[i].flame.setFilled(false); 
      pause (700); 
     } 
    } 

    private String nameTower(int n) { 
     switch (n) { 
      case 0: return ("Aguata"); 
      case 1: return ("Ekulobia"); 
      case 2: return ("Dike na fia"); 
      case 3: return ("Uli"); 
      case 4: return ("Aniche"); 
      case 5: return ("Achebe"); 
      case 6: return ("Akuwanta"); 
      case 7: return ("Ogbunike"); 
      case 8: return ("Obinohia"); 
      default: return null; 
     } 
    } 
} 

-

package myprojets; 
import java.awt.Color; 
import acm.graphics.*; 

public class erectTower extends GCompound { 

    private static final Color RED = null; 

    private GPolygon base; 
    private GRect mast; 
    public GPolygon flame; 

    public erectTower(GLabel towerName) { 
     base = creatBase(); 
     mast = new GRect(4.42,63.94); 
     flame = createFlame(); 
     add(base, 0,95); 
     add(mast,5.29,20.44); 
     add(flame,5.29,20.44); 
     add(towerName, (base.getWidth() - towerName.getWidth())/2 , 115); 
    } 

    private GPolygon creatBase() { 
     GPolygon poly1 = new GPolygon(); 
     poly1.addVertex(0.0, 0.0); 
     poly1.addEdge(5.29,-10.62); 
     poly1.addEdge(4.42,0.0); 
     poly1.addEdge(5.29,10.62); 
     poly1.addEdge(-15,0.0); 
     return poly1; 
    } 

    private GPolygon createFlame() { 
     GPolygon poly2 = new GPolygon(); 
     poly2.addVertex(0.0,0.0); 
     poly2.addEdge(-5.29,-10.44); 
     poly2.addEdge(5.60,4.85); 
     poly2.addEdge(1.90,-4.85); 
     poly2.addEdge(1.9,4.85); 
     poly2.addEdge(5.6,-4.85); 
     poly2.addEdge(-5.29,10.44); 
     poly2.addEdge(-4.42,0.0); 
     poly2.setColor(Color.RED); 
     return poly2; 
    } 
} 
+0

"blink" - это зло. –

+0

Appart из этого плохого стиля кода он должен работать. Какая ошибка? Я предполагаю «NullPointerException»? –

+0

Забудьте об идее 'NullPointerException'. Просто обнаружил вашу инициализацию массива. Но все же: какая именно ошибка? –

ответ

1

У вас есть массив GCompound с, а не класс, созданный, который расширяет GCompound (erectTower).

Изменение:

private GCompound[] name = { Aguata, Ekulobia, Dike_na_fia, Uli, Aniche, Achebe, Akuwanta, Ogbunike, Obinohia } ; 

в

private erectTower[] name = { Aguata, Ekulobia, Dike_na_fia, Uli, Aniche, Achebe, Akuwanta, Ogbunike, Obinohia } ; 

Наряду со всеми другими ссылками на GCompound так, что вы используете свой собственный класс.

+0

Полностью пропустил тот, спасибо! –

+0

Если вы нашли мой ответ достаточно, отметьте его как решенный! – Michael

+0

Я не ОП ;-) Просто подумал об этом сам. –

0

Хотя @ Майкл прав, я пытаюсь объяснить это немного больше. Ваш массив name имеет тип GCompound. Это означает, что все, что вы получаете через name[i], имеет статический тип GCompund. Это означает, что вы имеете доступ только к членам GCompund, хотя динамический тип во время выполнения будет erectTower. Позволяет сделать это более ясно, с помощью локальной переменной:

GCompound foo = name[i]; // works 
foo.flame.setFilled(true); // won't work because foo is GCompound 

erectTower bar = name[i]; // won't work without cast because array is of type GCompound 
bar.flame.setFilled(true); // would work if bar was correctly assigned before 

Вы можете изменить тип вашего массива, как предложено @Michael или вы можете привести переменную.

erectTower bar = (erectTower)name[i]; // works as long as all objects in your array are of type erectTower. Else it would throw a ClassCastException 
bar.flame.setFilled(true) // works 

Возможно, вы захотите ознакомиться с polymorphism and static/dynamic type.

Смежные вопросы