BlueJ - Breite des Bildschirms

Bitte aktiviere JavaScript!
Hallo, ich habe ein kleines Problem mit BlueJ. Es geht darum, dass ein Zug von rechts nach links auf dem Bildschirm fahren soll und wenn er den Bildschirm verlassen hat, wieder an den Anfang gesetzt wird.
Im Folgenden einmal die MainClass und die (abstrakte) Klasse Waggon:
1. MainClass
Java:
import sum.kern.*;

public class MainClass
{
    // Objekte
    Bildschirm derBildschirm;
    Stift meinStift;
    waggonEINS w1;
    waggonZWEI w2;
    waggonDREI w3;
    Lok w0;
    Maus dieMaus;
    Waggon irgendeinwaggon, W;
    Tastatur kb;


    // Konstruktor
    public MainClass()
    {
        int AnzahlWaggons = 0;
        derBildschirm = new Bildschirm(600,400);
        dieMaus = new Maus();
        kb = new Tastatur();
        w0 = new Lok(derBildschirm, 410, 200);
        AnzahlWaggons++;
        w1 = new waggonEINS(derBildschirm, 355, 200);
        AnzahlWaggons++;
        w0.setzeNF(w1);
        w2 = new waggonZWEI(derBildschirm, 300, 200);
        AnzahlWaggons++;
        w1.setzeNF(w2);
        w3 = new waggonDREI(derBildschirm, 245, 200);
        AnzahlWaggons++;
        w2.setzeNF(w3);
        irgendeinwaggon = w0;
        while (!dieMaus.doppelKlick()){
        
        
            while(irgendeinwaggon.kenntNF != null) {
                irgendeinwaggon.bewege();
                irgendeinwaggon = irgendeinwaggon.kenntNF;
            }
            irgendeinwaggon.bewege();
            if(kb.wurdeGedrueckt()){
                if(55 * AnzahlWaggons <= derBildschirm.breite()-55){
                    switch (kb.zeichen()){
                        case '0': W = new Lok(derBildschirm, -100, -100);
                        irgendeinwaggon.ankoppeln(W);
                        AnzahlWaggons++;
                        kb.weiter();
                        break;
                        case '1': W = new waggonEINS(derBildschirm, -100, -100);
                        irgendeinwaggon.ankoppeln(W);
                        AnzahlWaggons++;
                        kb.weiter();
                        break;
                        case '2': W = new waggonZWEI(derBildschirm, -100, -100);
                        irgendeinwaggon.ankoppeln(W);
                        AnzahlWaggons++;
                        kb.weiter();
                        break;
                        case '3': W = new waggonDREI(derBildschirm, -100, -100);
                        irgendeinwaggon.ankoppeln(W);
                        AnzahlWaggons++;
                        kb.weiter();
                        break;
                        case 'q': w0.abkoppeln();
                        AnzahlWaggons--;
                        kb.weiter();
                        break;
                        default:
                        kb.weiter();
                        break;
                    }
                } else{
                    switch(kb.zeichen()){
                        case 'q': w0.abkoppeln();
                        AnzahlWaggons--;
                        kb.weiter();
                        break;
                        default:
                        kb.weiter();
                        break;
                    }
                }
            
            }
        
                irgendeinwaggon = w0;
        }
        
    }

}
2. Waggon
Java:
import sum.kern.*;
/**
 * @author
 * @version
 */
public abstract class Waggon
{
    Stift meinStift;         
    Bildschirm kenntB, pB;
    Waggon kenntNF;
    Tastatur kb;
    Waggon letzterWaggon;
    

    // Konstruktor
    public Waggon()
    {
        meinStift = new Stift();
        kenntB = pB;
        kb = new Tastatur();
    }

    public abstract void zeichne();
    
    public void radiere(){
        meinStift.radiere();
        zeichne();
        meinStift.normal();
    }
    
    public void bewege(){
        if(meinStift.hPosition() >= pB.breite()){
            //radiere();
            //Auskommentiert, da der Zug sonst flackert.
            meinStift.bewegeBis(-50, 200);
        } else{
            radiere();
            meinStift.bewegeUm(1);
            zeichne();
        }
    }
    
    public void setzeNF(Waggon pNF){
        kenntNF = pNF;
    }
    
    public void zuPos(double pH, double pV){
        radiere();
        meinStift.bewegeBis(pH,pV);
        zeichne();
    }
    
    public void ankoppeln(Waggon ankop){
            if(kenntNF != null)
       {
                kenntNF.ankoppeln(ankop);
       }
       else
       {
                ankop.zuPos(meinStift.hPosition()-55,meinStift.vPosition());
                this.setzeNF(ankop);
       }
    }
    
    public void abkoppeln(){
        if(kenntNF != null){
             if(kenntNF.kenntNF != null)
             {
                 kenntNF.abkoppeln();
             }
             else
             {
                kenntNF.radiere();
                this.setzeNF(null);
            }
        }
    }
}
Das Problem ist jetzt in Zeile 33 der Klasse Waggon (genauer gesagt bei der Frage nach der Bildschirmbreite). Beim Ausführen des Programms kommt nämlich eine NullPointerException raus, ich finde allerdings den Fehler nicht.

Schonmal Vielen Dank an Alle!
 
Naja, im Konstruktor von Waggon schreibst Du kenntB = pB, dabei ist pB ein Feld der Klasse, das nicht gesetzt wurde und daher null ist.
 
Definiert in den einzelnen Waggons, also sollten die Parameter auch an die Oberklasse weitergegeben werden.
Java:
import sum.kern.*;
/**
 * @author
 * @version
 */
public class Lok extends Waggon
{
    // Objekte
    

    // Konstruktor
    public Lok(Bildschirm pB,int hPos,int vPos)
    {
        
        meinStift.bewegeBis(hPos,vPos);
        zeichne();
    }

    // Dienste
    public void zeichne()
    {
        double xh = meinStift.hPosition();
        double xv = meinStift.vPosition();
        meinStift.runter();
        meinStift.zeichneRechteck(20, 10);
        
        meinStift.runter();
        meinStift.dreheUm(-90);
        meinStift.bewegeUm(10);
        meinStift.dreheUm(90);
        meinStift.zeichneRechteck(50, 20);
        
        meinStift.bewegeUm(1);
        meinStift.hoch();
        meinStift.bewegeUm(18);
        
        
        meinStift.bewegeUm(-19);
        meinStift.bewegeUm(8);
        meinStift.dreheUm(90);
        meinStift.bewegeUm(8);
        meinStift.runter();
        meinStift.dreheUm(-90);
        meinStift.zeichneRechteck(10, 12);
        meinStift.hoch();
        meinStift.bewegeUm(-8);
        meinStift.dreheUm(90);
        meinStift.bewegeUm(2);
        meinStift.dreheUm(-90);
        meinStift.bewegeUm(7);
        meinStift.dreheUm(-90);
        meinStift.bewegeUm(37);
        meinStift.runter();
        meinStift.zeichneKreis(7);
        meinStift.hoch();
        meinStift.dreheUm(90);
        meinStift.bewegeUm(36);
        meinStift.zeichneKreis(7);
        meinStift.dreheUm(90);
        meinStift.bewegeUm(27);
        meinStift.runter();
        meinStift.bewegeUm(8);
        meinStift.dreheUm(90);
        meinStift.bewegeUm(4);
        meinStift.dreheUm(90);
        meinStift.bewegeUm(8);
        meinStift.hoch();
        meinStift.dreheUm(180);
        meinStift.bewegeUm(14);
        meinStift.dreheUm(90);
        meinStift.bewegeUm(4);
        meinStift.zeichneKreis(5);
        meinStift.dreheUm(-90);
        meinStift.bewegeUm(6);
        meinStift.dreheUm(90);
        meinStift.bewegeUm(5);
        meinStift.zeichneKreis(4);
        meinStift.dreheUm(-90);
        meinStift.bewegeUm(5);
        meinStift.dreheUm(90);
        meinStift.bewegeUm(4);
        meinStift.zeichneKreis(2);
        meinStift.hoch();
        meinStift.dreheBis(0);
        meinStift.bewegeBis(xh, xv);
    }
}
 
Definiert in den einzelnen Waggons, also sollten die Parameter auch an die Oberklasse weitergegeben werden.
Nein. Wenn Du Parameter des Konstruktors an den Konstruktor der Superklasse weitergeben willst, musst Du diesen explizit mit super(...) aufrufen, ansonsten wird der Defaultkonstruktor verwendet.

Du brauchst also in Wagon einen Konstruktor mit einem Bildschirmparameter und in Lok musst Du dann super(pB) aufrufen.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben