.getClass().getResource()

Status
Nicht offen für weitere Antworten.

AmunRa

Gesperrter Benutzer
Hallo
ich hab ein kleines Problem mit einem jar-Archiv.

Ich hab in meinem Jar Archiv einige Bilder. Die möchte ich laden
dazu verfwende ich dann
dann folgende Code-Zeile

Java:
Toolkit.getDefaultToolkit().createImage(this.getClass().getResource("/Icon5.jpg")

das klapp auch bei mir unter Linux ganz gut nur unter sonst keinem anderen Betriebsystem.
Hab das ganze unter Windows Vist/XP, Mac OsX, Knoppix geteste

bekomme ich bei folgendem Code null zurück nur bei Linux Ubuntu nicht
URL url= this.getClass().getResource("/Icon2.jpg");
Die Fehlermeldung die ich bekomme ist eine NullPointerException.


liegt wahrscheinlich daran, dass alle zuvor genannten Os einen anderen File.Separator verwenden
hab dann auch versucht einfach den Slash am Anfang weg zulassen, dann hat das ganze aber unter Ubuntu nicht funktioniert. und konnte dies leider unter den anderen nicht testen.

wenn ich den Slash mit System.getProperty(file.separator) ersetzen wollte ging das zwar unter Linux nur unter Windows wieder nicht.
Ich muss leider das Archiv unter allen Os zum laufen kriegen.

Wie muss ich das ändern?
Oder was mache ich falsch?

Danke
 

AmunRa

Gesperrter Benutzer
liegt wahrscheinlich daran, dass alle zuvor genannten Os einen anderen File.Separator verwenden
hab dann auch versucht einfach den Slash am Anfang weg zulassen, dann hat das ganze aber unter Ubuntu nicht funktioniert. und konnte dies leider unter den anderen nicht testen.

Wie ich bereits geschrieben hab hab ich das bereits versucht
nur da gings dann unter Linux (Ubuntu 8.10) nicht
 

Leroy42

Top Contributor
Nein! Es liegt daran, daß es unter sämtlichen Unix(es) und Linux
genau ein root-Verzeichnis gibt, das mit "/" am Anfang angesprochen wird,
unter Windoof jedoch merere
 

AmunRa

Gesperrter Benutzer
Kann ich jetzt nicht nachvoll ziehen
die Bilder liegen nicht im root verzeichnis, sondern in meinem jar-Archiv und und das wiederum liegt in irgend einem Ordner
 

AmunRa

Gesperrter Benutzer
Okey im Jar archiv liegen die jpeg-files in keinem weiteren Ordner, die class Datei liegt im Ordner dayRider/Menu

hat aber brav oben die
die Klausel

package dayRider.Menu

im Manifest des Jar Archivs steht folgendes.

Manifest-Version: 1.0

Main-Class: dayRider.Menu.Start



Start ist die Klasse mit der Main-Methode
 

Antoras

Top Contributor
Abend,

ich hab gerade das gleiche Problem. Das Image wird einfach nicht geladen. Der Code:
Java:
private Image image = null;
Java:
String imagePath = "/pic/pic.png";
image = getToolkit().getImage(getClass().getResource(imagePath));

Und auf ein Panel möchte ich das dann zeichnen:
Java:
private JPanel createPanel_Logo() {
	if (pnlLogo == null) {
		pnlLogo = new JPanel() {
			@Override
			protected void paintComponent(Graphics g) {
				super.paintComponent(g);
				g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
			}
		};
	}
	return pnlLogo;
}

Ich bekomme nur einen bescheuerten NullPointer. Dabei wird image definitiv beschrieben, hab extra im Debugger nachgeguckt. Genaue Fehlermeldung:
Code:
Uncaught error fetching image:
java.lang.NullPointerException
	at sun.awt.image.URLImageSource.getConnection(URLImageSource.java:99)
	at sun.awt.image.URLImageSource.getDecoder(URLImageSource.java:113)
	at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:240)
	at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
	at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)
Mir ist einfach schleierhaft wo der Fehler liegt. ???:L
 

faetzminator

Gesperrter Benutzer
Könnt ihr mal mit Zip oä verifizieren, dass die datei wirlich im jar ist? Dieser Weg - immer mit / am Anfang und überall im Pfad - sollte auf jedem OS funktionieren. :bahnhof:
 

Antoras

Top Contributor
Ich bekomme den Nullpointer schon beim Compilieren. Ich hab also noch nicht einmal ein Jar-Archiv.

Und ja, die Bilder wären bei mir im Archiv gewesen. Ich hatte die nämlich normal geladen, also über ein neues File. Dann wird im Archiv aber bekanntlich ja nichts angezeigt. Aber hatte extra nachgeguckt. Die Bilder waren drin.
 

AmunRa

Gesperrter Benutzer
wie ich ja bereits geschrieben hab funktioniert der Code ja bei mir unter meinem Ubuntu

das bedeutet er findet die Bilder im Archiv und bekommt ach die richtige URL von der getResource Methode.

Meine Frage ist nun wie kann man den Fehler umgehen, oder wie müsste das ganze Lauten für Windows denn wenn man da etwas anderes schreiben muss kann ich ja mit ner If Anweisung zuerst das Betriebsystem abfragen und dann jeweils darau reagieren.

Hab jetzt mal das entsprechende JarArchiv drangehängt damit ihr sehen könnt das die file richtig sind, wenn ihr wollt kann ich dann auch nocht den Sourcecode auch hochladen.
 

Anhänge

  • Menu.jar
    12,8 KB · Aufrufe: 20

faetzminator

Gesperrter Benutzer
Ich bekomme den Nullpointer schon beim Compilieren. Ich hab also noch nicht einmal ein Jar-Archiv.
und welches Kompilieren schmeisst NPE's :D ?

Hab jetzt mal das entsprechende JarArchiv drangehängt damit ihr sehen könnt das die file richtig sind, wenn ihr wollt kann ich dann auch nocht den Sourcecode auch hochladen.
funktioniert bei mir auch wunderbar mit folgendem Output (und den fünf Bildern):
Code:
[faetzminator@fkaros ~]$ java -jar Desktop/Menu.jar
jar:file:/home/faetzminator/Desktop/Menu.jar!/Icon2.jpg
 

faetzminator

Gesperrter Benutzer
das sollte man doch erkennen ;) (Arch) Linux

aber versuch mal statt getClass(). ... getClass().getClassloader(). ...
 

AmunRa

Gesperrter Benutzer
Du hast recht ich hab mir den output nicht ganz angeshen
aber zumindest weis ich dass das ganze also allgemein in Linux geht

was ist den der unterschied zu getClassloader() ?

kanns leider erst morgen wieder prüfen, da ich kein Windows zur hand habe.

Ich schreib dann morgen wies gelaufen ist
 

faetzminator

Gesperrter Benutzer
Ach ja, Class.getResource() ruft laut Javadoc intern entweder getClassLoader().getSystemResource() oder getClassLoader().getResource() auf, probier einfach mal beide Varianten von Hand aus
 

Antoras

Top Contributor
@AmunRa
Die Bilder deines Archives werden bei mir sowohl unter Windows, als auch unter Linux angezeigt.

@faetzminator
Die unterschiedlichen Methoden bringen bei mir keine Änderung...
 

faetzminator

Gesperrter Benutzer
Ich bezweifle, dass hier ein Problem von deinem Code vorliegt... /dir/dir2/file.ex funktioniert grundsätzlich im Jar...

EDIT: @Antoras, poste doch einmal deine gesamte Klasse
 

AmunRa

Gesperrter Benutzer
@AmunRa
Die Bilder deines Archives werden bei mir sowohl unter Windows, als auch unter Linux angezeigt.


Okey wenn das stimmt dann wirds bei mir schwer sein den Fehler zu finden denn , dann ist der Fehler nicht direkt reproduzier bar, denn bei mir hat das Archiv nur im Linux funktioniert und auf den Computern in meiner FH nicht
ich werds morgen noch einmal alles Testen.
 

Antoras

Top Contributor
Minimalbeispiel, gleicher Fehler:
Java:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class PictureTest
extends JFrame {
	
	private JPanel pnlPic = null;
	private Image image = null;
	
	public static void main(String[] args) {
		new PictureTest();
	}
	
	public PictureTest() {
		createWindow(400, 400, 300, 300);
	}
	
	
	public void createWindow(int w, int h, int x, int y) {
		try {
			setPreferredSize(new Dimension(w, h));
			setLocation(x, y);
			setDefaultCloseOperation(EXIT_ON_CLOSE);
			
			try {
				String imagePath = "/pic/phoenix.jpg";
				image = getToolkit().getImage(getClass().getResource(imagePath));
			} catch (Exception e) {
				System.err.println("Picture could not be showed: " + e);
			}
			
			add(createPanel_Pic());
			pack();
			setVisible(true);
		} catch (Exception e) {
			System.err.println("LoginManager could not be created: " + e);
		}
	}
	
	private JPanel createPanel_Pic() {
		if (pnlPic == null) {
			pnlPic = new JPanel() {
				@Override
				protected void paintComponent(Graphics g) {
					super.paintComponent(g);
					g.drawImage(image, 0, 0, getWidth(), getHeight(), this);
				}
			};
		}
		return pnlPic;
	}

}

EDIT: Sry, Bild vergessen. Hab es angehängt...oder nimm irgend eines
 

Anhänge

  • phoenix.jpg
    phoenix.jpg
    70,9 KB · Aufrufe: 42
Zuletzt bearbeitet:

Antoras

Top Contributor
Hm, ja gibt es. Leider. Hab im Debugger nicht weit genug geguckt. Das Toolkit ist nicht null, die url aber schon.
Würde ja bedeuten, dass der Pfad nicht gefunden wird, was aber nicht sein kann...

EDIT:
Wenn ich das Bild zum Bytecode tue und diesen Pfad setze, dann wird das Bild angezeigt:
Java:
String imagePath = "./phoenix.jpg";
Leider funktioniert das nicht noch immer nicht wenn das bild in einem anderen Ordner ist...


EDIT2: Verdammt:
Aber dein "data" Ordner muss in dem Ordern sein, in dem sich dein "bin" Verzeichnis befindet (also die .class Dateien).

'tschuldige, hab ich total vergessen zu erwähnen.
Quelle

Jetzt geht es. Hab für diesen Sch*** bestimmt 4h gebraucht, bis ich das jetzt raushatte. Wenigstens geht es jetzt. Selbst im jar-Archiv werden die Bilder angezeigt. Möchte nur wissen welcher "tolle" Java-Entwickler auf die Idee kam den Bytecode-Ursprungspfad als root-Directory zu missbrauchen.
 
Zuletzt bearbeitet:

AmunRa

Gesperrter Benutzer
Hab nun endlich eine Lösung für mein Problem gefunden.

Es war doch nicht die Methode getResource() sondern das problem lag an der Methode createImage
der klasse Toolkit

also einfach diese Zeile

Java:
Toolkit.getDefaultToolkit().createImage(this.getClass().getResource("/Icon5.jpg")
.
mit dieser erstzen
Java:
Toolkit.getDefaultToolkit().getImage(this.getClass().getResource("/Icon5.jpg")
.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben