Laden von eingebundenen .png Datein

Luk10

Top Contributor
Grüße,

Ich habe folgendes Problem:

Ich lade mit folgender Methode, .png Grafiken in BufferedImages.

Java:
	public BufferedImage loadSprite(String path) {
		
		BufferedImage source = null;
		
		try {
		
			source = ImageIO.read(new File(path));
			
			
		} catch (Exception e) {
 
			e.printStackTrace();
		
		}
		return source;	
	}

Das funktioniert auch einwandfrei wenn ich

a) Die .class Datei in Eclipse ausführe (als Path reicht hier das Hauptverzeichnis:
Code:
"pics/meineDatei.png"

b) Eine .jar Datei, mit eingebundenen Ordner (pics), jedoch muss ich dann
Code:
"C:/MeineDatein/pics/meineDatei.png"
angeben

Was ich will ist a), nur auch für die .jar Datei
Kann mir jemand sagen, wieso das nicht funktioniert und was ich ändern muss?

Danke,
-Luk10-
 
Aus einer JAR-Datei auf eine "File" zugreifen sollte man nicht (wundert mich, dass das so überhaupt geht). Man kann ImageIO.read auch einen Stream übergeben. In diesem Fall (sowohl bei einer Datei im .classes-Verzeichnis, als auch in einer Jar) kann man sich die Daten mit sowas wie
getClass().getResourceAsStream("/pic/bla.png");
holen (ggf. mal bei der Doku gucken, ich muss mit dem Pfad auch immer dreimal überlegen 😳 )
 
Wird denn der Ordner "pics" beim .jar Exportieren automatisch richtig angegeben? Bzw. passt es wenn ich der Ordner pics in dem Ordnermit scr und bin liegt?

Ich kenne mich leider mit Streams (I/O und sowas ebenfalls) nicht besonders gut aus. Kann mir das jemand gleich in der Methode verbesseren, oder mir einen geeigneten Link geben, wo ich das lernen kann?

Danke,
-Luk10-
 
Streams verwendet man meistens wie Files, sind nur abstrakter weil sie sich auch auf die Daten einer JAR beziehen können. Die Zugriffe auf die Dateien in der JAR sind, wenn man z.B. getResourceAsStream verwendet, relativ zum Ordner in dem sich die Klassen befinden, d.h. wenn du was hast wie
classes/pics/dasBild.png
dann sollte man wie oben angedeutet drauf zugreifen können. Beim Eclipse-JAR-Export werden die Dateien mit in die JAR gepackt (kann man aber in JAR-Export-Dialog nochmal prüfen).
 
Java:
try {
			
			source = ImageIO.read(getClass().getResource(path));
			
		} catch (Exception e) {
			
			System.err.println("Exception beim Laden des Images");
			
		}

Funktioniert nicht, da bekomme ich die Exception ... (Nur in Eclipse getestet)

Java:
try {
			
			source = ImageIO.read(getClass().getResourceAsStream(path));
			
		} catch (Exception e) {
			
			System.err.println("Exception beim Laden des Images");
			
		}

Funktioniert auch nicht, gibt auch die Exception aus (Nur in Eclipse)

Vielleicht stimmt meine Ordner-Struktur nicht?
Habe:

Workspace
-Project
--bin
--scr
--pics
---meinBild.png

Wieso funktioniert das beides nicht?
Danke,
-Luk10-

EDIT: Habs auch als .jar getestet ... kein Erfolg
 
Zuletzt bearbeitet:
Wie kann ich das machen, ohne dass mir Eclipse den Hals umdreht? Habe in meinem Package-Explorer den bin Ordner nicht drin und weiß auch nicht wie ich das sonst anstelle, ohne dass entweder das Projekt aus dem Workspace entfernt wird, oder der (manuell) erstellte Ordner im bin Ordner gelöscht wird.

Danke,
-Luk10-
 
verschiebe das ganze im Datei Explorer in den src Ordner, wenn Du dann in Eclipse im Package Explorer F5 drückst sollte das Package pics parallel zu Deinen anderen packages zu sehen sein.
 
Moin,

sauberer: Lege in Eclipse einen neuen zusätzlichen src Folder an, z.B. "resources" und kopiere die Bilder da rein. (Rechte Maustaste aufs Projekt -> New -> Source Folder)

Gruß,
Fancy
 
(Ja, sie ins bin kopieren sollte erstmal nur ein Test sein - wenn das jetzt geklappt hätte: Im JAR-Export-Dialog gibt's da auch extra die Einstellung, dass resources mit exportiert werden sollen)
 
(Sollte auch keine Kritik sein, sondern nur ein Hinweis an den TO, dass es das auch gibt.
(Immerhin den Hinweis, den einen direkt als "src/main/java" und den anderen als "src/main/resources" zu benennen habe ich mir verkniffen 😉))

Gruß,
Fancy
 
Wenn sie im src liegen, werden sie beim compilieren ggf. automatisch in den bin-Ordner kopiert. DA werden sie dann gebraucht, deswegen hatte ich gesagt, dass du sie (zum testen) erstmal da hin kopieren könntest. "Dauerhaftere" Lösungen wurden ja jetzt schon angedeutet.
 

Zurück
Oben