Thorsten F.: NullPointer bei addImage

Hi,

ich bis jetzt meine Bilder wie folgt im Konstruktor geladen:

img = getToolkit().getImage(irgendeinBild);
MediaTracker mt = new MediaTracker(this);
mt.addImage(img,0);
try
{
     mt.waitForAll();
}
catch (InterruptedException e)
{
     //nothing
}

Nun, bei ca. 15 Bildern ist das ganz schön viel Code.
Also habe ich mir folgende Funktion geschrieben, die ich im Konstruktor aufrufe: addImage(bild,bildPfad);

public void addImage(Image img,URL imgUrl)
 {
  img = getToolkit().getImage(imgUrl);
  MediaTracker mt = new MediaTracker(this);
  mt.addImage(img,0);
     try {mt.waitForAll();}
     catch (InterruptedException e) {}
 }

Vorher wurde das Bild korrekt dargstellt, jetzt jedoch bekomme ich eine Nullpointer-Exception im paint und zwar genau da, wo ich das Bild zeichne:
g.drawImage(img,100,100,50,30,this);

Woran liegt das?

Grüße,
Thorsten F.

  1. moin Thorsten F. :)

    public void addImage(Image img,URL imgUrl)
    {
      img = getToolkit().getImage(imgUrl);
      MediaTracker mt = new MediaTracker(this);
      mt.addImage(img,0);
         try {mt.waitForAll();}
         catch (InterruptedException e) {}
    }

    Vorher wurde das Bild korrekt dargstellt, jetzt jedoch bekomme ich eine Nullpointer-Exception im paint und zwar genau da, wo ich das Bild zeichne:
    g.drawImage(img,100,100,50,30,this);

    Woran liegt das?

    Das liegt daran, dass das img, das du zeichnen willst keinen Wert hat ;)
    Nein im Ernst: img ist null, weil du in deiner Methode zwar dem Objekt einen Wert zuweist - dies aber nicht öffentlich bekannt gibst.

    Du übergibst zwar ein Image-Objekt an die Methode - aber nicht wieder zurück an den Konstruktor. Egal wo du nun die paint-Methode aufrufst - sie wird nie wissen, dass img tatsächlich ein Bild hat. Dieses Wissen behält addImage für sich *g*

    Versuchs mal mit nem return :)

    liebe Grüße aus Berlin
    lina-

    --
    Dinge aus dem linaland
    Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
    1. Hi,

      ok, jetzt habe ich folgende Funktion:

      public Image addBild(Image img,URL imgUrl)
       {
        img = getToolkit().getImage(imgUrl);
        MediaTracker mt = new MediaTracker(this);
        mt.addImage(img,0);
           try {mt.waitForAll();}
           catch (InterruptedException e) {}
           return img;
       }

      Diese rufe ich im Konstruktor auf: addBild(bild,bildPfad);
      In der paint: g.drawImage(bild,x,y,width,height,this);

      Bekomme aber immer noch eine NullPointerException.

      Gruß,
      Thorsten F.

      1. moin Thorsten  :)

        Diese rufe ich im Konstruktor auf: addBild(bild,bildPfad);
        In der paint: g.drawImage(bild,x,y,width,height,this);

        Bekomme aber immer noch eine NullPointerException.

        Gib mal bitte den gesamten Konstruktor. Mit den Zeilen kann ich nix anfangen, weil ich ja nicht weiss was mit "bild" zwischenzeitlich passiert.

        liebe Grüße aus Berlin
        lina-

        --
        Dinge aus dem linaland
        Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
        1. Hi,

          also:

          Ich hole mir ein Bild:
          URL urlbild = getClass().getResource("irgendeinBildausPfadangabe");

          Das Bild selbst:
          Image mainBild;

          Nun die Funktion:

          public Image addBild(Image img,URL imgUrl)
           {
                img = getToolkit().getImage(imgUrl);
                MediaTracker mt = new MediaTracker(this);
                mt.addImage(img,0);
                try {mt.waitForAll();}
                catch (InterruptedException e) {}
                return img;
           }

          Und im Konstruktor rufe ich nur das auf:

          addBild(mainBild,urlbild);

          In der paint():
          g.drawImage(mainBild,x,y,w,h,this);

          Wenn ich das ohne addBild() mache, dann funktioniert das auch, denn da sah der Konstruktor noch so aus:

          mainBild = getToolkit().getImage(urlbild);
          MediaTracker mt = new MediaTracker(this);
          mt.addImage(mainBild,0);

          try
          {
               mt.waitForAll();
          }
          catch (InterruptedException e)
          {
               //nothing
          }

          1. moin Thorsten :)

            Ich hole mir ein Bild:
            URL urlbild = getClass().getResource("irgendeinBildausPfadangabe");

            Ok...

            Das Bild selbst:
            Image mainBild;

            Hier ist also das Image-Objekt... ohne Wert - also null.

            Und im Konstruktor rufe ich nur das auf:

            addBild(mainBild,urlbild);

            Und den Rückgabewert, den du brav eingefügt hast in der Funktion, ignorierst du?
            Die Zeile sollte besser lauten: mainBild=addBild(mainBild,urlbild);
            Anbei: macht es wirklich Sinn für jedes Bild nen eigenen MediaTracker zu verwenden?

            In der paint():
            g.drawImage(mainBild,x,y,w,h,this);

            Klar - mainBild ist ja auch immer noch null.

            liebe Grüße aus Berlin
            lina-

            --
            Dinge aus dem linaland
            Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
            1. Hi,

              jo besten Dank. Hätte vielleicht mal mein Gehinr anschalten sollen.

              Das mit dem Mediatracker meinst du so, dass ich diesen global initialisiere und dann diese Zeile "MediaTracker mt = new MediaTracker(this);" in der addBild() weglasse?

              Das habe ich mal grade gemacht.

              Grüße,
              Thorsten F.

              1. moin Thorsten F. :)

                Das mit dem Mediatracker meinst du so, dass ich diesen global initialisiere und dann diese Zeile "MediaTracker mt = new MediaTracker(this);" in der addBild() weglasse?

                Ja... ist meines Erachtens sinnvoller.

                liebe Grüße aus Berlin
                lina-

                --
                Dinge aus dem linaland
                Self-Code: ie:% fl:( br:^ va:) ls:/ fo:| rl:( ss:) de:] js:| mo:)
  2. Servus Thorsten,

    ich bis jetzt meine Bilder wie folgt im Konstruktor geladen:

    img = getToolkit().getImage(irgendeinBild);
    MediaTracker mt = new MediaTracker(this);
    mt.addImage(img,0);
    try
    {
         mt.waitForAll();
    }
    catch (InterruptedException e)
    {
         //nothing
    }

    das kannst Du kompensieren in:
    img = new ImageIcon(URL/Pfad).getImage();

    Vorher wurde das Bild korrekt dargstellt, jetzt jedoch bekomme ich eine Nullpointer-Exception (...)

    Das Problem wurde zwar bereits angesprochen, Du solltest jedoch weiterhin überlegen, ob (sofern du diese Methode tatsächlich benutzen möchtest) die Methodensignatur nicht überarbeitet werden sollte.

    addImage(Image img,URL imgUrl)

    Wenn "img" zurück gegeben wird, macht es keinen Sinn, der Methode eine Referenz auf ein Image zu geben ("img").

    Freundliche Grüße
    Stefano Albrecht

    --
    Sancta Simplicitas!