Applet Auslesen von Images aus Ressourcen

D

Drenius

Gast
Hallo.
Ich habe ein simples kleines Spiel mit einem JFrame erstellt, es funktioniert einwandfrei.
Da es aber nunmal wirklich ziemlich simpel ist, wollte ich daraus ein JApplet machen.
Auch das funktioniert grösstenteils gut, aber meine benutzte Funktion zum auslesen von Bilddateien

Java:
	public static Image imageFromRessource(String path, Class<?> cl)
	{
		try 
		{
			Image image = ImageIO.read(cl.getClass().getResourceAsStream(path));
			return image;
		} 
		catch (IOException e) 
		{
			e.printStackTrace();
		}
		return null;
	}
Funktioniert nicht mehr.
Im JFrame liess sich daraus sehr leicht mit
Java:
new ImageIcon(Static.imageFromRessource("/package/dateiname", this.getClass()));
bislang ganz einfach ein ICon laden.

Im JApplet aber findet er aber offenbar den Dateipfad nicht mehr.

Weiss jemand, wie dieses Problem zu lösen ist?
 

jemandzehage

Aktives Mitglied
Moin
Im Applet funktioniert die Ein-/Ausgabe etwas anders. Allerdings gibt es da für Bilder schon eine vorgefertigte Methode:

Java:
Image image = getImage(getCodeBase(), pathToFile);

Gruß
 
D

Drenius

Gast
Danke!
Aber funktioniert
Java:
Image image = getImage(getCodeBase(), pathToFile);
Mit Ressourcen oder externen Dateien?
 

jemandzehage

Aktives Mitglied
Hi,

in einem solchen Fall helfen die docs von Java weiter: Applet (Java 2 Platform SE v1.4.2)

Die Funktion
Java:
public Image getImage(URL url, String path)
aus Applet gibt ein Bild zurück, welches sich relativ zu der angebenen URL befindet. Da du ja wahrscheinlich eigene Resourcen verwenden möchtest, eignet sich deine eigene URL ganz gut. Dazu kennt das Applet aber schon die eigene URL, die du mittels getCodeBase() abfragen kannst. Somit läuft das Applet, egal auf welches Server du es höchlädst (bzw. lokal läuft).

Gruß
 
D

Drenius

Gast
Aus irgendeinem Grund funktioniert es trotzdem nicht.
Statt der Klasse wir jetzt das JApplet an die Funktion übergeben und die Dateien existieren sowohl als Ressource als auch als externe Dateien unter dem selben Pfad. Aber aus irgendeinem Grund gibt er trotzdem einen Fehler ("java.lang.reflect.InvocationTargetException") aus.
 
D

Drenius

Gast
Die Funktion umgeschrieben in
Java:
public static Image imageFromRessource(String path, JApplet cl)
{
	Image image = cl.getImage(cl.getCodeBase(), path);
	return image;
}

Und bspw. an einer Stelle
Java:
decimal.setIcon(new ImageIcon(Static.imageFromRessource("numbers/"+decimalNumber+".png", applet)));
Dabei ist applet das an dieses JPanel übergebene JApplet.
 
S

Spacerat

Gast
@Gui-Programmer: Weil man dadurch leicht in die Verlegenheit kommt, File und andere Objekte ausser URL zu verwenden. Applets funktionieren dann meist nur noch lokal in IDEs oder anderen Umgebungen ohne Security-Manager. Soweit ich das in Erinnerung habe, wird "<Applet>.getImage()" direkt an den AppletContext delegiert und Sun verwendet dort dann ohnehin ImageIO. Aber die Quelle ist dann zumindest immer eine URL.
 
S

Spacerat

Gast
@TO: Also ich denke mal, dass die übergebene URL nicht null ist. Von daher prüfe ganz einfach mal mit "<URL>.openStream();" ob sie nicht evtl. ins Leere führt.

Im Übrigen habe ich mir noch mal den entsprechenden Code (die Klasse AppletImageRef) angesehen und da wird tatsächlich mit Toolkit gearbeitet. Allerdings wird während des gesamten Ladevorgangs (soweit ich das überblicke) nicht ein einziges mal Reflection verwendet. Also frage ich mich, woher diese InvocationTargetException kommt.
 
D

Drenius

Gast
Achja, es ist noch erwähnenswert, dass die ursprüngliche Funktion mit den ursprünglichen Pfaden in der Eclipse-Simulation einwandtfrei funktioniert.
 
S

Spacerat

Gast
Boioioioioinnnnggg... ;)
Das deutet sehr darauf hin, dass die URL entweder auf einen Fremdserver zeigt oder das File-Protokoll verwendet. Bei der Verwendung von "getCodeBase()" ist das eher unwahrscheinlich, es sei denn, der "Ersatzpfad" ist nicht relativ (z.B. wenn er Laufwerksbuchstaben, Backslash oder ähnliches beinhaltet).
 
Zuletzt bearbeitet von einem Moderator:
D

Drenius

Gast
Aber in der ursprünglichen Funktion war doch getCodeBase gar nicht vorhanden?

Sowohl in der JFrame- als auch in der simulierten JApplet-Version funktioniert die Ressourcen-Ladefunktion ja einwandtfrei. Nur nach dem Export funktioniert es nicht mehr.
Kennt denn niemand eine Direkte Lösung dafür?
 
S

Spacerat

Gast
Was man für externe Ressourcen noch in Frage käme, wäre, wenn man die URLs per Parameter übergibt und sie in der "init()"-Methode des Applets nachlädt. Für Ressourcen innerhalb des Archives würde immer noch "<Class>.getRessource()" (und zwar ohne "getCodeBase()") reichen. Der Pfad müsste dann aber relativ zur verwendeten Klasse angegeben werden.
 
D

Drenius

Gast
In der selben Package wie der der Klassen sind die unterpackages .texture und .numbers und darin sind die gesuchten dateien.
Wie wäre also der Pfad zu einer der Dateien?
unterpackage/filename.png funktioniert nicht.
 
S

Spacerat

Gast
In der selben Package wie der der Klassen sind die unterpackages .texture und .numbers und darin sind die gesuchten dateien.
Wie wäre also der Pfad zu einer der Dateien?
unterpackage/filename.png funktioniert nicht.
Nu' wirds interessant. Bei folgender Archivstruktur
Code:
game
 | Main.class
 |
 -res
     test.png
funktioniert bei mir folgendes:
Java:
URL resource = Main.class.getResource("res/test.png");
 
D

Drenius

Gast
So sollte es auch eigentlich gehen. Aber irgendwie funktioniert es nicht.
Genau damit wären wir wieder beim ursprünglichen Problem...
 
S

Spacerat

Gast
Und das bedeutet? Verzeichnisstruktur im Archiv überprüfen bzw. überprüfen lassen. Wie wär's, wenn du die mal postest? ;) Zumindest die in Frage kommenden Parts.
 
D

Drenius

Gast
Pixels
|
|- alle Klassen
|
|- Pixels.texture
| |- Texturen
|
|- Pixels.numbers
|- Texturen (Zahlen 1-9)

Eventuell müssen unterpackages auch irgendwie mit eben diesem Punkt angesprochen werden?
 
S

Spacerat

Gast
Also zumindest mus der Pfad relativ zum Paketpfad der Klasse angegeben werden. Befindet sich die Klasse also im Verzeichnis "Pixel", so lautet der Pfad zu den Texturen "texture/bild.png" und zu den Zahlen "numbers/wasauchimmer.nmb"
 

L-ectron-X

Gesperrter Benutzer
Soweit ich das in Erinnerung habe, wird "<Applet>.getImage()" direkt an den AppletContext delegiert und Sun verwendet dort dann ohnehin ImageIO.
So lange, wie ich das nicht aus offizieller Quelle lese, glaube ich das nicht. Da frage ich mich, wozu man dann in [JAPI]Applet[/JAPI]s zum Laden von Bildern mit getImage() noch den [JAPI]MediaTracker[/JAPI] braucht...


@Drenius: So lange, wie du hier nur dürftige Informationen hinterlässt, wird es ganz schwierig, hier zu helfen.
Hast du denn mal versucht, passenden Code aus dem obigen Link einzubauen?
Wenn ja, wie sieht der aus?
Hast du Fehlermeldungen ion deiner Java-Console während du das Applet laufen lässt?
Wenn ja, wie ist deren Wortlaut?
 
S

Spacerat

Gast
Im Übrigen habe ich mir noch mal den entsprechenden Code (die Klasse AppletImageRef) angesehen und da wird tatsächlich mit Toolkit gearbeitet. Allerdings wird während des gesamten Ladevorgangs (soweit ich das überblicke) nicht ein einziges mal Reflection verwendet. Also frage ich mich, woher diese InvocationTargetException kommt.
@L-Ectron-X: Da tust du gut dran... ich glaubs auch nicht mehr. Hab' stattdessen im Quelltext nachgesehen. ;)
 
D

Drenius

Gast
@L-ectron-X
Du hast Recht, aber habe ich das nicht schon alles?
Naja dann nochmal alles hier:

Das ist die Funktion
Java:
    public static Image imageFromRessource(String path, Class<?> cl)
    {
        try 
        {
            Image image = ImageIO.read(cl.getClass().getResourceAsStream(path));
            return image;
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
        return null;
    }

Das ganze wird zz angewendet mit
Java:
new ImageIcon(Static.imageFromRessource("texture/dateiname.png", this.getClass()));

Die Ordnerstruktur:
Pixels
|
|- alle Klassen
|
|- Pixels.texture
| |- Texturen
|
|- Pixels.numbers
|- Texturen (Zahlen 1-9)

und er gibt schon vor irgendeiner Form von sichtbarer Initialisierung ein
"java.lang.reflect.InvocationTargetException"
aus.

Es muss an den Texturen liegen, da es komplett ohne besagten Code einwandfrei funktioniert - nur halt ohne Texturen.
 
S

Spacerat

Gast
Ähhh... Kollege... Class.getClass() ist definitiv Class.class. Klar, das dann deine Pfade nicht stimmen. ;)
Java:
    public static Image imageFromRessource(String path, Object obj) // Hier Instanz der Klasse uebergeben, in deinem Fall "this"
    {
        try 
        {
            Image image = ImageIO.read(obj.getClass().getResourceAsStream(path));
            return image;
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
        return null;
    }
[EDIT]Nimms dem "Kollegen" nicht übel... Hauptsach' is' dass jetzt alles Class-Klar is'.[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
G

Guest2

Gast
Moin,

neben dem doppelten getClass() kann es imho auch nicht schaden den InputStream auf null zu prüfen, bzw. die IllegalArgumentException abzufangen, um im Zweifelsfall den Fehler eingrenzen zu können.

In kleineren Projekten nutze ich gerne etwa folgendes:

Java:
public enum Images {


    ERROR("images/error.png"),
    OK("images/ok.png"),
    QUESTION("images/question.png");


    private final Image image;


    private Images(final String resource) {

        try {

            image = ImageIO.read(getClass().getClassLoader().getResourceAsStream(resource));

        } catch (final IOException e) {

            System.err.println("Image read exception: " + resource);

            throw new RuntimeException(e);

        } catch (final IllegalArgumentException e) {

            System.err.println("Image not found: " + resource);

            throw new RuntimeException(e);

        }


    }


    public final Image getImage() {

        return image;

    }


}

Aufruf mit: [c]Images.OK.getImage()[/c]

Die Pfade in Images sind dabei immer vom ClassLoader aus gesehen. Und funktioniert so immer, solange die Bilder im ClassPath liegen, also auch innerhalb eines Applets. Sobald ein Image fehlt, wird sofort bei Anwendungsstart eine Meldung ausgegeben und abgebrochen.


Viele Grüße,
Fancy
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z Swing Wert aus Textfeld auslesen -- null Fehler AWT, Swing, JavaFX & SWT 4
B Swing Posistion von JButton auslesen gibt immer 0 aus AWT, Swing, JavaFX & SWT 1
J JFram Location aus Konstruktor einer anderen Klasse auslesen AWT, Swing, JavaFX & SWT 10
it_is_all Swing Mehrere JComboBoxen - wie die versch. Boxen mit ItemStateChange auslesen? AWT, Swing, JavaFX & SWT 3
T Swing JTable auslesen und befüllen AWT, Swing, JavaFX & SWT 8
Soloeco Swing JTextField auslesen Klassen übergreifend AWT, Swing, JavaFX & SWT 16
M JavaFX - Array in View auslesen AWT, Swing, JavaFX & SWT 12
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
B JavaFX Symbole aus Fonts auslesen AWT, Swing, JavaFX & SWT 1
sandaime Swing Thread für CMD auslesen AWT, Swing, JavaFX & SWT 16
G Werte aus dem GUI Auslesen AWT, Swing, JavaFX & SWT 8
3 JComboBox - Action - Auslesen & Umwandeln AWT, Swing, JavaFX & SWT 9
X Swing Per Button die Labels und Textfelder auslesen AWT, Swing, JavaFX & SWT 8
D JavaFX Dynamisch erzeugte Checkboxen aus VBox auslesen AWT, Swing, JavaFX & SWT 3
thobren JavaFX Inhalte aus dynamischen vbox mit TextArea auslesen AWT, Swing, JavaFX & SWT 9
F geänderten Textfeldinhalt mit parse auslesen AWT, Swing, JavaFX & SWT 1
T Swing NullPointerException beim auslesen von jTextField - Anfänger! AWT, Swing, JavaFX & SWT 3
M JavaFX Wert aus Tabellenzelle auslesen AWT, Swing, JavaFX & SWT 4
M Swing JFreechart X-Achse Tick auslesen AWT, Swing, JavaFX & SWT 13
T Swing jComboBox auslesen mit Datenbankanbindung AWT, Swing, JavaFX & SWT 3
P Swing JTable Werte auslesen bzw überschreiben AWT, Swing, JavaFX & SWT 5
O Swing Text aus Textfield auslesen AWT, Swing, JavaFX & SWT 8
T Swing "Textgröße" aus OS auslesen AWT, Swing, JavaFX & SWT 3
D Swing Farbe aus Pixel vom JFrame auslesen AWT, Swing, JavaFX & SWT 17
R Array aus einem Objekt auslesen AWT, Swing, JavaFX & SWT 4
F Swing jComboBox auslesen AWT, Swing, JavaFX & SWT 6
T SWT Table (mit Spinner Spalte) Daten auslesen AWT, Swing, JavaFX & SWT 4
R Int aus JSpinner auslesen und Tabelle erstellen AWT, Swing, JavaFX & SWT 3
X Gridbaglayout gridx + gridy auslesen? AWT, Swing, JavaFX & SWT 7
M JTextField gibt beim auslesen null aus AWT, Swing, JavaFX & SWT 9
L SWT Eingabefelder beim Schließen des Forms auslesen AWT, Swing, JavaFX & SWT 3
F icon aus exe auslesen mithilfe des JFilechooser ? AWT, Swing, JavaFX & SWT 4
F Textfelder auslesen AWT, Swing, JavaFX & SWT 12
T 3D-Grafik (Java3D) Aus einem Objekt einer Szene (Würfel, Ebene) die wichtigen Randkoordinaten auslesen AWT, Swing, JavaFX & SWT 3
P gleichanfangende Zeilen solange auslesen bis es die gibt AWT, Swing, JavaFX & SWT 12
J JTextField auslesen lassen AWT, Swing, JavaFX & SWT 4
C Swing TextField auslesen AWT, Swing, JavaFX & SWT 21
C TextFelder auslesen AWT, Swing, JavaFX & SWT 20
E Textfeld auslesen AWT, Swing, JavaFX & SWT 2
F SWT Tabelle Zeile auslesen AWT, Swing, JavaFX & SWT 3
M Position eines JLabels mit getX() auslesen AWT, Swing, JavaFX & SWT 2
D SWT CheckBox auslesen (Window Builder Pro) AWT, Swing, JavaFX & SWT 2
E Wert eines selektierten Knotens in einem JTree auslesen AWT, Swing, JavaFX & SWT 3
J Mausposition auslesen AWT, Swing, JavaFX & SWT 4
L Name des JLabels auslesen bei Mouseclick AWT, Swing, JavaFX & SWT 2
A Swing Slider-Value auslesen und weitergeben AWT, Swing, JavaFX & SWT 4
B Swing Betrag mit Komma aus jformattedtextfield auslesen. AWT, Swing, JavaFX & SWT 2
Y JSlider Wert auslesen (Kategorien) AWT, Swing, JavaFX & SWT 2
K Text vom JTextField auslesen AWT, Swing, JavaFX & SWT 9
E werte aus List auslesen AWT, Swing, JavaFX & SWT 2
R Textfield auslesen auf Anforderung AWT, Swing, JavaFX & SWT 4
M Zeitkritisches auslesen von Tastatureingaben AWT, Swing, JavaFX & SWT 6
M Swing JTextField "onthefly" auslesen und berechnen AWT, Swing, JavaFX & SWT 7
C Swing JPasswordField Password auslesen AWT, Swing, JavaFX & SWT 7
K 2D-Grafik Fehler beim Farbe auslesen AWT, Swing, JavaFX & SWT 3
K JTable Werte auslesen AWT, Swing, JavaFX & SWT 2
T JSpinner in JTable: Problem beim Auslesen, funktioniert erst beim Zellwechsel AWT, Swing, JavaFX & SWT 7
3 2D-Grafik Rechtecke auf Bilder legen und auslesen AWT, Swing, JavaFX & SWT 4
P Swing ComboBox(en) in JTable auslesen und ausgeben AWT, Swing, JavaFX & SWT 11
1 Textfeld auslesen AWT, Swing, JavaFX & SWT 11
R TextField auslesen & in Objekteigenschaften speichern AWT, Swing, JavaFX & SWT 22
J JSpinner + SpinnerNumberModel int auslesen AWT, Swing, JavaFX & SWT 2
S JPanel auslesen AWT, Swing, JavaFX & SWT 3
S JTextField auslesen AWT, Swing, JavaFX & SWT 2
M JTabbedPane - Tab auslesen AWT, Swing, JavaFX & SWT 2
M auslesen mehrerer JComboBoxen funktioniert nicht AWT, Swing, JavaFX & SWT 9
M Java swt link url auslesen AWT, Swing, JavaFX & SWT 5
T ComboBox auslesen AWT, Swing, JavaFX & SWT 11
Airwolf89 Swing Pfad mit "\" auslesen AWT, Swing, JavaFX & SWT 6
N jTable mit JComboBox auslesen AWT, Swing, JavaFX & SWT 6
P Swing Hintergrundfarbe auslesen und wieder setzen AWT, Swing, JavaFX & SWT 4
D SWT String aus Textfeld auslesen und in eine Tabelle speichern AWT, Swing, JavaFX & SWT 5
F checkboxen auslesen/ansprechen AWT, Swing, JavaFX & SWT 1
T SWT Canvas Koordinaten per MouseMove auslesen AWT, Swing, JavaFX & SWT 1
C Swing Mit jTree ein Ordneröffnen Dialog machen? Und Ordner Inhalt auslesen? AWT, Swing, JavaFX & SWT 4
S Bilder aus der Google Book Search API auslesen AWT, Swing, JavaFX & SWT 3
J Daten in JTable nach Sortierung auslesen AWT, Swing, JavaFX & SWT 2
S Swing noch nicht übergebenen Wert aus JComboBox auslesen AWT, Swing, JavaFX & SWT 4
JavaKaffee Array auslesen in jTextPane? AWT, Swing, JavaFX & SWT 9
A Auslesen eines JTextField AWT, Swing, JavaFX & SWT 3
M Comboboxen in JTable - Werte auslesen AWT, Swing, JavaFX & SWT 9
calzone Swing JTable/DefaultTableModel, rowData auslesen ? AWT, Swing, JavaFX & SWT 15
P List-Einträge auslesen AWT, Swing, JavaFX & SWT 4
D Inhalt einer JTable Celle auslesen AWT, Swing, JavaFX & SWT 3
N JFilechooser File auslesen AWT, Swing, JavaFX & SWT 10
T JTree auslesen AWT, Swing, JavaFX & SWT 4
K Textfelder auslesen gibt immer Fehler AWT, Swing, JavaFX & SWT 2
A Wert einer JComboBox auslesen AWT, Swing, JavaFX & SWT 1
M JPasswordfield.getpassword() char[] nicht codiert auslesen? AWT, Swing, JavaFX & SWT 2
S JAVA-Doc intern auslesen AWT, Swing, JavaFX & SWT 2
C jComboBox KeyListener -> Box auslesen AWT, Swing, JavaFX & SWT 3
G JTable Daten auslesen AWT, Swing, JavaFX & SWT 2
J Integer aus Textdatei auslesen und in Variable speichern AWT, Swing, JavaFX & SWT 11
A Problem mit JFormattedTextField auslesen AWT, Swing, JavaFX & SWT 11
O JTable auslesen AWT, Swing, JavaFX & SWT 2
T Pixelfarbe auslesen AWT, Swing, JavaFX & SWT 4
M Auslesen veränderter Daten in einer jTable AWT, Swing, JavaFX & SWT 2
A Fehler beim Auslesen aus einem Textfeld AWT, Swing, JavaFX & SWT 2
O Datei binär auslesen AWT, Swing, JavaFX & SWT 2
Y Zahlen aus einer Textarea auslesen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben