# Applet zeigt Bilder nicht an



## florian1x (31. Mai 2010)

Hallo,

ich habe folgendes Problem. 
Ich habe in einem projekt für die Hochschule ein JApplet entwickelt. Die funktionen des Applet sind jetzt nicht so relevant.

Ich will in meinem Applet einige Bilder darstellen. Wenn ich das Applet aus Eclipse / Netbenas herraus starte geht das auch wunderbar. Aber sobald ich versuche das Applet aus dem Browser (bei mir firefox) zu starten wird dies nicht geladen. und es kommt folgende fehlermeldung


java.security.AccessControlException: access denied (java.io.FilePermission icons/nolight.gif read)
	at java.security.AccessControlContext.checkPermission(Unknown Source)
	at java.security.AccessController.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkRead(Unknown Source)
	at sun.awt.SunToolkit.getImageFromHash(Unknown Source)
	at sun.awt.SunToolkit.getImage(Unknown Source)
	at javax.swing.ImageIcon.<init>(Unknown Source)
	at javax.swing.ImageIcon.<init>(Unknown Source)
	at gui.lok.LokControlPanel.<init>(LokControlPanel.java:73)
	at gui.lok.LokPanel.<init>(LokPanel.java:54)
	at gui.MainPanel.<init>(MainPanel.java:44)
	at gui.MainApplet.init(MainApplet.java:35)
	at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Ausnahme: java.security.AccessControlException: access denied (java.io.FilePermission icons/nolight.gif read)

danach habe ich ein wenig gegoogelt.
und mein applet signiert. Jetzt lässt es sich starten zeigt jedoch kein einziges bild an.

ich habe unterschiedliche JPanel, die ich je nach bedarf an entsprechenden Stellen einbinde.
Und die bilder binde ich dann in die JPanels so ein...

[Java]
lPic = new ImageIcon("icons/nolight.gif");
fIconLabel = new JLabel(lPic);
[/Java]

und dann wird das label über add eingebunden.

könnt ihr mir helfen?


----------



## L-ectron-X (31. Mai 2010)

Das geht nur ohne Signieren, wenn du die Bilder über den URL des Applets lädst. Sonst greifst du automatisch direkt auf die lokale Verzeichnisebene des Clients zu. Und das ist nicht signierten Applet bekanntermaßen nicht erlaubt.
Grafikdateien laden und anzeigen - Byte-Welt Wiki


----------



## florian1x (1. Jun 2010)

danke ich versuchs mal.
da steht ja eigentlich alles wichtige im link.
sollte es funktionieren, werde ichs aber auch noch einma hier rein posten wie es geht


----------



## florian1x (1. Jun 2010)

Also ich mache das jetzt wie folgt ...

ich habe mir eine Klasse MyImage geschrieben

```
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class MyImage extends JPanel{
	Image image;
	
	public MyImage(String filename) {
		try {
			image = ImageIO.read(getClass().getResource(filename));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void setFile(String filename){
		try {
			image = ImageIO.read(getClass().getResource(filename));
		} catch (IOException e) {
			e.printStackTrace();
		}
		repaint();
	}
	
	@Override public void paint(Graphics g) {
		super.paint(g);
		if(image != null) 
	         g.drawImage(image, 0, 0, this);
	}
}
```

und im applet schreibe ich dann 


```
MyImage img = new MyImage("../icons/lok.gif");
add(img);
```

klappt auch soweit ganz gut. Nur wenn ich dass nun versuche MyImage in einem JPanel dazustellen, welches ich meiner Appletoberfläche hinzufüge, wird nichts angezeigt.


----------



## L-ectron-X (1. Jun 2010)

Von Swing-Komponenten (abgesehen von JApplet) wird die paintComponent()-Methode zum Zeichnen überschrieben.
Ich würde das daher so machen:

```
import java.awt.*;
import java.io.IOException;
 
import javax.imageio.ImageIO;
import javax.swing.JPanel;
 
public class MyImage extends JPanel{
    Image image;
    
    public MyImage(String filename) {
        setFile(filename);
    }
    
    public void setFile(String filename){
        try {
            image = ImageIO.read(getClass().getResource(filename));
        } catch (IOException e) {
            e.printStackTrace();
        }
        repaint();
    }
    
    @Override public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if(image != null) 
             g.drawImage(image, 0, 0, this);
    }
}
```

Und deine Zeile


			
				florian1x hat gesagt.:
			
		

> ```
> MyImage img = new MyImage("../icons/lok.gif");
> ```


funktioniert nur, wenn sich das Bild zu deinem Applet relativ in einem Verzeichnis über - und dann in einem dort zu findenden Verzeichnis _icons_ befindet. Besser ist es meiner Meinung nach, die Bilder als Teil der Anwendung eine Ebene tiefer zu speichern.
Also dort:

```
MyImage img = new MyImage("icons/lok.gif");
```


----------



## florian1x (1. Jun 2010)

danke für die schnelle Antwort mit dem paintComponent

das mit dem ../ habe ich gemacht weil ich die grafiken in verschiedenen packages benutze und die grafiken nicht mehrfach abspeichern wollte.

ich versuchs ersma mit paint Component.


----------

