Java Relativer Pfad / Export mit Eclipse

te one

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.252
Hallo,
seit ein paar Tagen programmiere ich nun ein bisschen mit Java und wollte gleich mal mit einem kleinen Spiel anfangen.
Bis jetzt kann man nur das Spiel starten und anhalten, und der Hintergrund bewegt sich von rechts nach links.
Allerdings bin ich jetzt auf ein anscheinend sehr kniffliges Problem gekommen. (Zumindest für mich)

Hier der erste Teil meines Konstruktors der Klasse Game:
Code:
	public Game()
	{
		try
		{
			bgimage = ImageIO.read(new File("C:\\Users\\Michael\\Desktop\\Java\\Game\\src\\background.gif"));
		}
		catch (IOException e)
		{
			System.out.println("Konnte Grafik nicht laden!");
			System.out.println(e);
			
		}
//Hier kommt noch einiges, u.A. werden immer wieder die Grafiken geladen

Das funktioniert soweit super, allerdings habe ich, wie man schon sieht einen absoluten Pfad zum Hintergrundbild verwendet.
Wie baue ich da einen relativen ein? (hab schon "\\background.gif" usw. durchprobiert, wird allerdings immer eine exception geworfen)

Nun funktioniert das natürlich nicht, wenn ich eine ausführbare .jar-Datei mache und auf nem anderen Rechner benutzen will...
Google konnte mir leider auch nicht wirklich helfen (teilweiße auch sehr schwer, als Java-Anfänger aus so komplexem Code den man dann findet, das rauszusuchen was man braucht)
Wäre schön wenn mir da einer helfen könnte!
Und wie läuft das dann beim Export? Wie füg ich dem Jar-File das Bild hinzu (oder ists womöglich automatisch dabei wenn ichs im Projektordner von Eclipse abgelegt habe)?
 
am besten machst du dies über den Classloader

Code:
ClassLoader.getSystemClassLoader().getSystemResourceAsStream("background.gif")
 
Du kannst die Bilder ruhig direkt in deinem JAR-File unterbingen. Vllt. machst du dafür ein eigenes Package, wo die dann drinliegen. Alternatic kannst du ein zusätzliches JAR-File machen, wo ausschließlich Bilder drin sind.


An den Stream dieser Bilder kommst du mit getResourceAsStream()

Diese Methode kannst du auf jedem Klassenobjekt aufrufen und nimmt als Parameter einen String entgegen, welcher den Pfad zur Resource beschreibt. Als Ergebnis bekommst du einen InputStream.

Beispiel:
MeinKlasse.class.getResourceAsStream("com/meine/packages/meinbild.png");



Es gibt zwar noch ein paar Dinge zu beachten bzgl. Classloader, die sollten Dich in Deinem Anwendungsfall aber nicht betreffen.
 
Zuletzt bearbeitet: (Code Fehler: statt. müssen es / sein um die packages zu trennen.)
Okay werde später oder vllt erst morgen eure Lösungen mal probieren.
Danke für die Hilfe erstmal, mal gucken ob ichs hinbekomme.
Ergänzung ()

sry, aber ich bekomms einfach nicht zum laufen.

Wie muss ich folgende Zeile ändern, wenn ich ein package "pics" mit dem background.gif angelegt habe?

Code:
bgimage = ImageIO.read(new File("C:\\Users\\Michael\\Desktop\\Java\\Game\\src\\background.gif"));

Hab schon viele Varianten probiert. Aber irgendwie läufts nicht.


edit:
Code:
InputStream path=ClassLoader.getSystemResourceAsStream("pics\\background.gif");
System.out.println(path);
gibt folgendes aus:

java.io.BufferedInputStream@7d2152e6
Hilft mir das jetzt was?^^
 
Zuletzt bearbeitet:
in deiner ersten code-zeile ist das background.gif gar nicht in einem unterverzeichnis (package) "pics".


Zu deinem zweiten Beispiel. Vergleich mal, was ich oben gepostet habe mit deinem Versuch...Da sind Unterschiede.

Frage, Was erwartest du, wenn du einen inputstream direkt mit System.out auf die console schrebst? Die ausgabe sieht mir eher danach aus, als hättest du einen gültigen inputstream bekommen...immerhin ist es ein echtes objekt und nicht null.
 
Jop das mit dem Pfad war mein Fehler.
War noch der alte Code. Das Bild liegt nun wirklich im Unterordner pics.

Hatte den Code von dir auch schon probiert. Aber warte mal ich teste gleich nochmal

edit: Aso wenn das ein richtiges Objekt ist, dann kann ichs natürlich schlecht so ausgeben.
Aber dann isses ja echt schon ein gutes Zeichen, wenn das was ausgibt
Ergänzung ()

Hab nochmal mit dem Code von dir rumprobiert
:(
Es rennt super, dein Code hat genau gepasst.
Weiß nicht, was ich da vorhin falsch gemacht habe

Vielen Dank für die schnelle Hilfe
Falls es jemanden interessiert, der Code ist jetzt:

Code:
InputStream path=Game.class.getResourceAsStream("pics/background.gif");
bgimage = ImageIO.read(path);
 
Zuletzt bearbeitet: (Code hat funktioniert)
Zurück
Oben