# Problem beim laden eines Bildes in einer Methode



## skappler (28. Mrz 2009)

Hallo
Ich möchte mit einem Freund ein kleines Auto spiel machen.
Wir sind schon soweit das ein kleines Auto aus Rechtecken fahren kann. 
Nun wollen wir aber diese rechteckkonstruktion durch ein bild ersetzen.
Hier die Auto Methode:

[HIGHLIGHT="Java"]import java.awt.*;
import java.*;
/**
 * @author schueler1
 * 
 */
public class Auto{
	int h1, h2, b1, b2, d;

	int x, y;

	Image autoRechts=getImage(getDocumentBase(),"auto_rechts.jpg");
	Image autoLinks;
	Image autoRunter;
	Image autoHoch;

	Color farbe = Color.BLUE;


	Auto(int x0, int y0) {

		x = x0;
		y = y0;
		h1 = 8;
		h2 = 5;
		b1 = 25;
		b2 = 35;
		d = 5;
	}

	void vorwaerts(int v) {
		x = x + v;
	}

	void runter(int r) {
		y = y + r;
	}

	void maleAuto(Graphics g) {
		g.setColor(farbe);
		g.drawRect(x, y, b1, h1);
		g.fillRect(x, y + h1, b2, h2);
		g.drawOval(x + d, y + h1 + h2, d, d);
		g.drawOval(x + b2 - 2 * d, y + h1 + h2, d, d);

	}//hier wird das alte Auto gezeichnet
}[/HIGHLIGHT]


Nun wird aber bei 
Image autoRechts=getImage(getDocumentBase(),"auto_rechts.jpg");
das getDocumentBase() unterschlängelt mit der Meldung:

The method getDocumentBase() is undefined for the type Auto


Ich hoffe ihr könnt mir helfen


----------



## Marco13 (28. Mrz 2009)

Die Methode gibt es nur in einem Applet/JApplet. Wenn es irgendwo ein Applet gibt, könnt ihr DORT diese Methode verwenden um das Image zu laden, und das Image dann an das Auto übergeben (z.B. im Konstruktor von "Auto")


----------



## skappler (28. Mrz 2009)

ok vielen dank.
in der maleAuto-methode
was muss ich da als ImageObserver nehmen?
This funktioniert nicht.


----------



## Marco13 (29. Mrz 2009)

Bei drawImage!? I.a. sollte es schon 'null' tun...


----------



## skappler (29. Mrz 2009)

sehr gut...
wenn ich das applet jetz aber ausführen will kommt eine Fehlermeldung:

java.lang.NullPointerException
	at java.applet.Applet.getDocumentBase(Unknown Source)
	at StartGame.<init>(StartGame.java:31)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at java.lang.Class.newInstance0(Unknown Source)
	at java.lang.Class.newInstance(Unknown Source)
	at sun.applet.AppletPanel.createApplet(Unknown Source)
	at sun.applet.AppletPanel.runLoader(Unknown Source)
	at sun.applet.AppletPanel.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)


gemeint ist folgende Zeile


```
Image img=getImage(getDocumentBase(),"auto_rechts.JPG");
```


----------



## Marco13 (29. Mrz 2009)

Hm - und du startest das ganze wirklich als Applet (und nicht als Application?) - Und das Bild existiert wirklich? Schau mal auf Seiten wie Loading Images und poste ggf. deinen aktuellen Quellode und eine kurze Beschreibung, wie du das ganze startest.


----------



## skappler (29. Mrz 2009)

hier mal der quelltext:


```
import java.awt.Dimension;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

import java.awt.*;

/**
 * This code was edited or generated using CloudGarden's Jigloo SWT/Swing GUI
 * Builder, which is free for non-commercial use. If Jigloo is being used
 * commercially (ie, by a corporation, company or business for any purpose
 * whatever) then you should purchase a license for each developer using Jigloo.
 * Please visit www.cloudgarden.com for details. Use of Jigloo implies
 * acceptance of these licensing terms. A COMMERCIAL LICENSE HAS NOT BEEN
 * PURCHASED FOR THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED LEGALLY FOR
 * ANY CORPORATE OR COMMERCIAL PURPOSE.
 */
public class StartGame extends javax.swing.JApplet {

	/**
	 * Auto-generated main method to display this JApplet inside a new JFrame.
	 */
	private Canvas canvas1;
	Image img=getImage(getDocumentBase(),"auto_rechts.JPG");
	
	Auto auto1;

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JFrame frame = new JFrame();
				StartGame inst = new StartGame();
				frame.getContentPane().add(inst);
				((JComponent) frame.getContentPane()).setPreferredSize(inst
						.getSize());
				frame.pack();
				frame.setVisible(true);
			}
		});

	}

	public StartGame() {
		super();
		initGUI();
		auto1 = new Auto(20, 80,img);
	}

	private void initGUI() {
		try {
			this.setSize(660, 433);
			getContentPane().setLayout(null);
			getContentPane().setBackground(new java.awt.Color(65,65,65));
			{
				canvas1 = new Canvas();
				getContentPane().add(canvas1);
				canvas1.setBounds(0, 0, 660, 433);
				canvas1.addKeyListener(new KeyAdapter() {
					public void keyPressed(KeyEvent evt) {
						canvas1KeyPressed(evt);
					}
				});
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void paint(Graphics g) {
		super.paint(g);
		g = this.canvas1.getGraphics();
		super.paint(g);
		auto1.maleAuto(g);
	}

	private void canvas1KeyPressed(KeyEvent evt) {
		System.out.println("canvas1.keyPressed, event=" + evt);
		// TODO add your code for canvas1.keyPressed
		if (evt.getKeyCode() == KeyEvent.VK_RIGHT)
			auto1.vorwaerts(10);
		if (evt.getKeyCode() == KeyEvent.VK_LEFT)
			auto1.vorwaerts(-5);
		if (evt.getKeyCode() == KeyEvent.VK_UP)
			auto1.runter(-8);
		if (evt.getKeyCode() == KeyEvent.VK_DOWN)
			auto1.runter(8);
		repaint();
	}

}
```

starten tu ich dsa ganze über den grünen pfeil bei eclipse und wähle dann applet aus


----------



## Marco13 (29. Mrz 2009)

Das getDocumentBase darf erst nach der init-Methode aufgerufen werden. Schau dir nochmal die Beispiele auf der verlinkten Seite an.

BTW: Man sollte nicht Swing (JApplet) und AWT (Canvas) mischen. Statt des Canvas solltest du eine JComponent verwenden.


----------



## skappler (30. Mrz 2009)

Ich hab das ganze jetzt unter den Aufruf initGUI() gemacht, das führt aber zum selben ergebnis..........
auch wenn ich das ganze unter das private void initGUI schreibe..........
bzgl Canvas.........das Rahmenkonstrukt stammt von unserm Informatiklehrer


----------



## Marco13 (30. Mrz 2009)

Ich meinte die "init"-Methode von "Applet". Applet hat eine "init"-Methode und erst nachdem die Aufgerufen wurde, ist getDocumentBase wirklich möglich. Hast du dir die Verlinkte Seite anesehen?

Und BTW: Lehrer sind auch nur Menschen. Offiziell, und rein rechtlich, natürlich...


----------



## skappler (30. Mrz 2009)

also soweit ich dsa sehe gibts da keine init methode XD
oder muss ich die von hand nachträglich reinschreiben

edit: funktioniert jetzt, das bild wird aber nicht angezeigt


----------



## Marco13 (30. Mrz 2009)

Die gibt es. Die ist schon Teil von "Applet". Du kannst sie überschreiben

```
public void init()
{
    super.init();
    // Hier kannst du jetzt eigenen Kram machen...
}
```
In diesem Fall ist das nicht unbedingt notwendig, aber dort kann ggf. auch das Bild geladen werden.

Eigentlich nervt es mich ja, wenn ich Code produzieren muss, der schon 100000 mal auf 100000 Beispielseiten steht, aber... ach, egal...

```
// Von http://www.java-forum.org/grafik-und-spieleprogrammierung/81080-problem-beim-laden-eines-bildes-einer-methode.html#post503174

import java.awt.Dimension;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

import java.awt.*;

/**
 * This code was edited or generated using CloudGarden's Jigloo SWT/Swing GUI
 * Builder, which is free for non-commercial use. If Jigloo is being used
 * commercially (ie, by a corporation, company or business for any purpose
 * whatever) then you should purchase a license for each developer using Jigloo.
 * Please visit www.cloudgarden.com for details. Use of Jigloo implies
 * acceptance of these licensing terms. A COMMERCIAL LICENSE HAS NOT BEEN
 * PURCHASED FOR THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED LEGALLY FOR
 * ANY CORPORATE OR COMMERCIAL PURPOSE.
 */
public class StartGame extends javax.swing.JApplet {

    /**
     * Auto-generated main method to display this JApplet inside a new JFrame.
     */
    private Canvas canvas1;

    //Auto auto1;
    Image img;


    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                StartGame inst = new StartGame();
                frame.getContentPane().add(inst);
                ((JComponent) frame.getContentPane()).setPreferredSize(inst
                        .getSize());
                frame.pack();
                frame.setVisible(true);
            }
        });

    }

    public StartGame() {
        super();
        initGUI();
    }

    public void init()
    {
        super.init();
        img=getImage(getDocumentBase(),"bild.png");

        MediaTracker tracker = new MediaTracker(this);
        tracker.addImage(img, 0);
        try {
            tracker.waitForAll();
        } catch (InterruptedException e) {
        return;
        }

        //auto1 = new Auto(20, 80,img);
    }



    private void initGUI() {
        /*
        try {
            this.setSize(660, 433);
            getContentPane().setLayout(null);
            getContentPane().setBackground(new java.awt.Color(65,65,65));
            {
                canvas1 = new Canvas();
                getContentPane().add(canvas1);
                canvas1.setBounds(0, 0, 660, 433);
                canvas1.addKeyListener(new KeyAdapter() {
                    public void keyPressed(KeyEvent evt) {
                        canvas1KeyPressed(evt);
                    }
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        */
    }

    public void paint(Graphics g) {
        super.paint(g);
        //g = this.canvas1.getGraphics(); // NEIN; NEIN; NEIN: KEIN getGraphics!!!
        //super.paint(g);
        //auto1.maleAuto(g);
        g.drawImage(img, 0,0, null);

    }

    private void canvas1KeyPressed(KeyEvent evt)
    {
        /*
        System.out.println("canvas1.keyPressed, event=" + evt);
        // TODO add your code for canvas1.keyPressed
        if (evt.getKeyCode() == KeyEvent.VK_RIGHT)
            auto1.vorwaerts(10);
        if (evt.getKeyCode() == KeyEvent.VK_LEFT)
            auto1.vorwaerts(-5);
        if (evt.getKeyCode() == KeyEvent.VK_UP)
            auto1.runter(-8);
        if (evt.getKeyCode() == KeyEvent.VK_DOWN)
            auto1.runter(8);
        repaint();
        */
    }

}
```


----------



## skappler (30. Mrz 2009)

ok dsa geht jetzt aber wie bereits im edit erwähnt zeichnet er das bild nicht.....

Auto.class


```
Image autoRechts;
.
.
.
.
Auto(int x0, int y0,Image img) {
		autoRechts=img;
		x = x0;
		y = y0;
		/*h1 = 8;
		h2 = 5;
		b1 = 25;
		b2 = 35;
		d = 5;*/
	}

void maleAuto(Graphics g) {
		g.drawImage(autoRechts, x, y,null);
		/*g.setColor(farbe);
		g.drawRect(x, y, b1, h1);
		g.fillRect(x, y + h1, b2, h2);
		g.drawOval(x + d, y + h1 + h2, d, d);
		g.drawOval(x + b2 - 2 * d, y + h1 + h2, d, d);*/
		
	}
```




EDIT: hat sich erledigt.......war ein kleiner dummer fehler.....vielen dank nochmal


----------



## L-ectron-X (31. Mrz 2009)

@Marco13: Da sind immernoch Standardfehler drin.

Es wird AWT mit Swing gemischt. => Ein JApplet mit benutztem Canvas, welches am Ende wahrscheinlich das in der paint()-Methode gezeichnete Bild verdeckt.
Wieso eigentlich paint()? Wird in einem JApplet nicht paintComponent() überschrieben?
Das Applet hat eine main()-Methode. (Gibts nicht in einem Applet!)


----------



## Marco13 (31. Mrz 2009)

Die main "stört nicht", den Teil mit dem Canvas hatte ich auskommentiert, und ... ein JApplet hat keine paintComponent-Methode - dass man paint bei einem JApplet genausowenig überschreiben sollte, wie paint bei einem JFrame, könnte man noch erwähnen. Aber ... ich hatte versucht, das ganze mit möglichst wenigen Änderungen in die Nähe dessen zu bringen, worum es (vermutlich) geht, aber ... naja ...vielleicht hätte ich mich dieses Threads nicht annehmen sollen  ich sollte versuchen, besser einzuschätzen, bei welchen Threads der :rtfm: - Impuls überhand nehmen könnte....


----------

