[Erledigt] graphics2d.drawImage mit NullPointerException

Moin,
nachdem ich mich gestern bereits Stunden erfolglos mit der Problemlösung beschäftigte, hat vielleicht hier jemand eine Idee.
Laut Debugger (Netbeans 5.5) wirft mir diese Zeile eine NullPointerException:

Gemäß Debugger ist weder das logoImage NULL noch das g2d-Objekt noch myLogo. width beträgt 559.
Das logoImage hole ich mir eine Zeile zuvor mittels

Image logoImage = myLogo.getImageFromIcon();

Die weitere Herleitung des Images geschieht in MyLogo extends Canvas so:

        Image retImage = img3.getImage();
        return retImage;
    }

    private void getLogo() {
        URL url = MyLogo.class.getResource("MyLogo.gif");
        if (url != null) {
            img3 = new ImageIcon(url, "");
        }
    }

Die URL wird korrekt gefüllt, das img3 ebenfalls sowie das myLogo = new MyLogo().
Wo ist der Fehler, mein Denkfehler, was übersehe ich, dass es beim drawImage eine NPE gibt?? Oder verarscht mich der Debugger?

Nachtrag, um die Verwirrung komplett zu machen:
Während aus Netbeans heraus die NPE fliegt und das Drucken direkt fehlschlägt, tritt beim Programmlauf ausserhalb Netbeans die NPE gar nicht auf, es wird gedruckt, aber das Logo fehlt.

Ich geh mal davon aus das du schon nachgesehen hast ob g2d, logoImage und myLogo nicht null sind.
Ich kann dir nicht genau sagen wie du das jetzt machen kannst da ich Netbeans nicht kenn, bei eclipse kann man die src.zip des JDK angeben und dann kannst du auch die Java Methoden debuggen. So kannst du dann direkt in die draw Methode gehen und nachsehen wo da die Exception fliegt, das könnte dir helfen.

So wie es aussieht, gibt es wohl Probleme mit dem gif.
Ich habe es mir angeschaut und es sieht ziemlich kaputt aus. Eine andere gif wurde jedoch auch nicht angezeigt. Ich verwende jetzt eine jpg. Kann es sein, dass es generell Probleme mit gifs gibt?

nein, das kann nicht sein. Kannst du vllt ein kurzes kompilierbares Beispiel posten?

Ich fürchte nicht. Noch nicht einmal die einfachsten Beispiele von Sun oder auch der an anderer Stelle erfolgreich funktionierende Code will in meinem Testprojekt nicht. Ich flipp hier noch aus, aber nicht mehr heute.

Wenn du keine AWT-Anwendung schreibst, solltest du von JPanel bzw. JComponent erben.

Möglicherweise ist irgendwas im NetBeansprojekt kaputt.
Versuch mal ein ganz neues NetBeansprojekt zu erstellen und deine .java und .form Dateien dorthin zu kopieren :wink:

Moin Andre,
sehr interessant, mit einem neuen Projekt funktioniert es tatsächlich. Irgendwas scheint wohl schon mal mit dem Test-Projekt nicht zu stimmen, in dem zugegebenermaßen ein paar mehr Tests und Testklassen enthalten sind.
Danke für den Tipp!

Ich habe ein ganz ähnliches Problem:

win.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		
// Logo setzen
Graphics2D g = (Graphics2D) win.getGraphics();
ImageIcon logo = new ImageIcon("millgabel.jpg");
g.drawImage(logo.getImage(), 5, 5, new DynamicImageObserver());```

```import java.awt.Image;
import java.awt.image.ImageObserver;

public class DynamicImageObserver implements ImageObserver {
	public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
		return true;
	}
}```

Was stimmt da nicht? Beim Compilieren zeigt er eine NullPointerException an, obwohl keiner der Parameter gleich NULL ist :(

der Compiler wird dir bestimmt keine Nullpointer geheben sowas gibs nur zur Laufzeit :wink:
wo tritt er denn auf?

Stimmt, Denkfehler xD (Ein Kaffee heute Morgen war nicht genug)

In dieser Zeile:

g.drawImage(logo.getImage(), 5, 5, new DynamicImageObserver());

Eclipse gibt folgendes aus:

Exception in thread „main“ java.lang.NullPointerException
at RefreshFileList.initGUI(RefreshFileList.java:158)
at RefreshFileList.main(RefreshFileList.java:283)

logo ist nicht zufälligerweise null?

Nein, schon nachgeprüft!

Versuch’s mal so:

/*
 * LogoTest.java
 */
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
public class LogoTest {
    private LogoPanel logo;
    public LogoTest() {
        JFrame win = new JFrame("WFL MediaList Refresher");
        win.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        win.setSize(400,300);
        win.setLocationRelativeTo(null);
        logo = new LogoPanel();
        win.add(logo);
        win.setVisible(true);
    }
    public static void main(final String[] args) {new LogoTest();}
}
class LogoPanel extends JPanel{
    private Image img;
    public LogoPanel(){
        img = new ImageIcon("millgabel.jpg").getImage();
    }
    
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        // Logo setzen
        g.drawImage(img, 5, 5, this);
    }
}```

Das wäre eine Idee. Aber kann man den Layoutmanager für bestimmte Komponenten ungültig machen?
Dass quasi nur das Bild absolut gesetzt werden kann?

        logo.setBounds(100,100,400,300);
        layeredpane = win.getLayeredPane();
        layeredpane.add(logo, JLayeredPane.DEFAULT_LAYER);```

Muchas gracias! :slight_smile: