Hallo zusammen,
ich versuche mit derzeit an Hand des Buches "Java will nur spielen" ein bisschen in Java einzuarbeiten. Abgesehen davon dass mir vor lauter Klassen und dazugehörigen Methoden (wie soll man das jemals alles wissen?) ganz schön der Kopf raucht habe ich ein Problem beim Darstellen einer Bilddatei. Um genau zu sein nicht einer Bilddatei - sondern jeglicher Bilddatei. Dabei geht es mir nicht ums Zeichnen, das funktioniert, sondern um wirkliche Bilddateien aus dem Dateisystem.
Ich verwende Linux (openSUSE 12.1 (x86_64)) und folgende java Version:
Der Fehler den ich beim beim Ausführen von PaintableImage erhalte ist folgender:
Im Buch geht es anschließend damit weiter, dass der verwendet Weg nicht optimal ist, da unter Umständen das Bild noch nicht ganz geladen ist wenn die Größe abgefragt wird und deshalb als Größe -1 zurückgeliefert wird (was ja bei mir durchaus auch der Fall ist). Nach meinem Verständnis müsste das Bild aber trotzdem dargestellt werden. Bei mir öffnet sich jedoch ausschließlich ein leeres Fenster und aus der Konsole kommt wie gesagt oben gezeigte Exception.
Ich habe den Code jetzt wirklich gefühlte hundertmal durchgesehen und mit den Beispielen und dem Quellcode aus dem Buch abgeglichen, aber mir sind weder Fehler noch Unterschiede aufgefallen und so langsam gehen mir auch die Ideen aus (untertrieben gesagt).
Erfahrungsgemäß sieht jemand mit Ahnung immer relativ schnell woran es hakt, wenn mir also jemand einen Hinweis geben kann woran es liegt wäre ich wirklich dankbar. Die einzelnen Klassen folgen. Das Bild liegt an der selben Stelle wie auch der Quellcode (*.java) und die meisten Klassendateien im Verzeichnisbaum der der Paketstruktur entspricht. Lediglich die ShowInFrame-Klasse liegt in einem anderen Paket.
Nachdem ich definitiv Einsteiger bin und der Fehler vermutlich auch in diese Kategorie fällt habe ich dieses Subforum gewählt, wenn die Frage besser ins AWT/Swing Forum passt bitte entsprechend verschieben.
Vielen Dank schon mal fürs Anschauen!
ich versuche mit derzeit an Hand des Buches "Java will nur spielen" ein bisschen in Java einzuarbeiten. Abgesehen davon dass mir vor lauter Klassen und dazugehörigen Methoden (wie soll man das jemals alles wissen?) ganz schön der Kopf raucht habe ich ein Problem beim Darstellen einer Bilddatei. Um genau zu sein nicht einer Bilddatei - sondern jeglicher Bilddatei. Dabei geht es mir nicht ums Zeichnen, das funktioniert, sondern um wirkliche Bilddateien aus dem Dateisystem.
Ich verwende Linux (openSUSE 12.1 (x86_64)) und folgende java Version:
Code:
java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.1) (suse-3.1-x86_64)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
Der Fehler den ich beim beim Ausführen von PaintableImage erhalte ist folgender:
Code:
-1
Uncaught error fetching image:
java.lang.NullPointerException
at sun.awt.image.URLImageSource.getConnection(URLImageSource.java:115)
at sun.awt.image.URLImageSource.getDecoder(URLImageSource.java:125)
at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:258)
at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:189)
at sun.awt.image.ImageFetcher.run(ImageFetcher.java:153)
Im Buch geht es anschließend damit weiter, dass der verwendet Weg nicht optimal ist, da unter Umständen das Bild noch nicht ganz geladen ist wenn die Größe abgefragt wird und deshalb als Größe -1 zurückgeliefert wird (was ja bei mir durchaus auch der Fall ist). Nach meinem Verständnis müsste das Bild aber trotzdem dargestellt werden. Bei mir öffnet sich jedoch ausschließlich ein leeres Fenster und aus der Konsole kommt wie gesagt oben gezeigte Exception.
Ich habe den Code jetzt wirklich gefühlte hundertmal durchgesehen und mit den Beispielen und dem Quellcode aus dem Buch abgeglichen, aber mir sind weder Fehler noch Unterschiede aufgefallen und so langsam gehen mir auch die Ideen aus (untertrieben gesagt).
Erfahrungsgemäß sieht jemand mit Ahnung immer relativ schnell woran es hakt, wenn mir also jemand einen Hinweis geben kann woran es liegt wäre ich wirklich dankbar. Die einzelnen Klassen folgen. Das Bild liegt an der selben Stelle wie auch der Quellcode (*.java) und die meisten Klassendateien im Verzeichnisbaum der der Paketstruktur entspricht. Lediglich die ShowInFrame-Klasse liegt in einem anderen Paket.
Nachdem ich definitiv Einsteiger bin und der Fehler vermutlich auch in diese Kategorie fällt habe ich dieses Subforum gewählt, wenn die Frage besser ins AWT/Swing Forum passt bitte entsprechend verschieben.
Vielen Dank schon mal fürs Anschauen!
Java:
package [somePackage];
import [someOtherPackage].ShowInFrame;
import javax.swing.JPanel;
public class PaintableImage extends JPanel implements Paintable{
MyImage mi;
public PaintableImage(MyImage mi){this.mi=mi;}
public PaintableImage(String name){this.mi=new MyImage(name);}
public void paintTo(java.awt.Graphics g){
g.drawImage(mi.get(),0,0,this);
}
public static void main(String [] args){
PaintableImage pi = new PaintableImage("test.png");
//System.out.println(pi.mi);
System.out.println(pi.mi.get().getHeight(pi));
ShowInFrame.show(new PaintablePanel(pi));
}
}
Java:
package [somePackage];
import java.awt.Image;
import java.awt.Toolkit;
public class MyImage{
private String name;
private Image img=null;
public MyImage(String name){this.name=name;}
public Image get(){
if(img==null)
img=Toolkit.getDefaultToolkit().createImage
(getClass().getClassLoader().getResource(name));
return img;
}
}
Java:
package [somePackage];
interface Paintable{
void paintTo(java.awt.Graphics g);
}
Java:
package [somePackage];
import [someOtherPackage].ShowInFrame;
public class PaintablePanel extends SizedPanel{
Paintable pa;
public PaintablePanel(Paintable pa){this.pa=pa;}
public void paintComponent(java.awt.Graphics g){
pa.paintTo(g);
}
public static void main(String[] args){
ShowInFrame.show(new PaintablePanel(new PaintableOval(100,50,30,50)));
ShowInFrame.show(new PaintablePanel(new PaintableOval(10,10,130,40)));
}
}
Java:
package [someOtherPackage];
import javax.swing.*;
public class ShowInFrame{
public static void show(String title,JComponent c){
JFrame f = new JFrame(title);
f.add(c);
f.pack();
f.setVisible(true);
}
public static void show(JComponent c){show("",c);}
}