Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich habe ein Applet geschriegen, in dem *.gif Bilder geladen werden müssen.
Als Application oder auch im Appletviewer funktioniert das natürlich problemlos, aber über einen HTML-Aufruf nicht mehr, da Dateizugriffe für Applets gesperrt sind.
Dazu muß meines wissens ein Applet signiert werden, dann kommt eine sinnlose Sicherheitsabfrage und es läuft einfach.
Das "keytool" und den "jarsigner" habe ich bereits gefunden. Einen Jarfile bekomme ich prinzipiell erstellt und auch signiert.
Jedoch stellt sich die Frage: Wie geht es weiter? Eine Application kann ich aus dem jar File heraus direkt starten, aber wie muß ich mit einem Applet verfahren?
Das will ich nicht in dem *.jar File benutzen, sondern z.B. wieder auf einen FTP Server laden.
Ich kann also einen jar-File signieren, aber am Ende nichts mit anfangen. Wie handhabt man das richtig?
Oder gibt es tatsächlich eine Lösung für das Bilderproblem ohne Signatur?
Ich habe die Bilder mit in der Verzeichnisstruktur und diese werden an verschiedenen Stellen des Applets auch geladen.
Die Bilder werden mit auf den Server kopiert oder zu Testzwecken von der Festplatte aus benutzt.
Beim Aufruf über eine HTML Datei erscheint ein Platzhalter für das Applet und die Java console gibt folgende Fehlermeldung:
java.security.AccessControlException: access denied (java.io.FilePermission bilder\setfeld.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 KnopfSetup.MaleBild(KnopfSetup.java:54)
at KnopfSetup.<init>(KnopfSetup.java:31)
at PanelMaster.<init>(PanelMaster.java:28)
at Reversi.init(Reversi.java:17)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Dann bin ich darauf gestoßen, daß man Applets signieren muß für Dateizugriffe. Ist das richtig? Würde das das Problem beheben?
Dann vielleicht die alternative Frage: Kann man mit Applets auf Bilder oder Dateien zugreifen, ohne diese zu signieren? Eigentlich dürfte das doch nicht der Fall sein.
Zudem huscht die Literatur immer sehr oberflächlich über diese Themen hinweg.
Ich verstehe jetzt noch nicht ganz, wo es hier lang gehen soll...
Du hast das Applet in einem .jar-File und auch bereits signiert. Außerdem ist es auf dem Webserver und wurde auch von dort aus auch schon in den Browser geladen.
Und nun kannst du diese AccessControlException in der Console bewundern und weiß nicht warum?
Du hast leider den Eingangstext so formuliert, dass ich deinem Problem nicht richtig folgen konnte...
Edit: Habe an meinem Beitrag gearbeitet, während du dich registriert hast.
Also grundsätzlich sind Dateioperationen auf Systemebene (lesen, schreiben) für Applets verboten.
Um die Rechte von Applets zu erweitern müssen diese signiert werden.
Ich habe noch nie Canvas benutzt, kann daher auch wenig dazu sagen.
Bilder lade ich mindestens immer mit:
Dann mache ich mal langsam und Schrittweise weiter.
Ich kann eine Applikation in einen *.jar File packen und signieren. Anschließend entweder bei entsprechend konfiguriertem System (meist automatisch) per Doppelklick starten oder auf Kommandozeilenebene von Hand: javaw.exe -jar *.jar
Bei Applikationen funktioniert das auch wunderbar.
Ein Applet bringt mir nur als *.jar File überhaupt nichts, weil ich es doch mittels Appelt-tag in einer *.htm Seite aufrufe und den Platz dort zur Verfügung stelle. Oder kann ich auch irgendwie auf diesen *.jar File zugreifen mittels HTML Code?
Das Kommando "getImage(...)" funktioniert meines Wissens nur in von Applet abgeleiteten Klassen. Ansonsten lautet der volle Befehl "getToolkit().getImage(...)" und wird über java.awt.Toolkit zur Verfügung gestellt. Daher auch das Problem.
Vielleicht sogar von Anfang an Falsch angegangen?
Ziel ist es:
- Es gibt eine einzige Klasse von Applet abgeleitet ( also class blub extends Applet{...})
- In dieser Klasse werden nur Klassen hinzugefügt, die von Panel abgeleitet sind
- Die Panel Klassen enthalten Instanzen von den von Canvas abgeleiteten Klassen. In diesen werden Bilder geladen.
Sinn und Zweck ist es, daß das Programm gleich aufgebaut ist und wahlweise als Applikation oder Applet aufgerufen werden kann und sich also nur in der "Hauptklasse" unterscheidet.
Code:
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
public class CanvKnopf
extends Canvas
{
private int bild;
private Image img;
public CanvKnopf(int bild)
{
this.bild = bild;
MaleBild(bild);
}
public int GetBild()
{
return bild;
}
public void MaleBild(int bild)
{
String fname;
if (bild == -1)
{
fname = "bilder\\bild1.gif";
}
else
{
fname = "bilder\\bild2.gif";
}
img = getToolkit().getImage(fname);
MediaTracker mt = new MediaTracker(this);
mt.addImage(img, 0);
try
{
mt.waitForAll(); // Bild wird vorgeladen
} catch (InterruptedException e){}
this.repaint();
}
// legt die Größe des Bildes fest
public Dimension getPreferredSize()
{
return new Dimension(
img.getWidth(this),
img.getHeight(this)
);
}
// legt die Größe des Bildes fest
public Dimension getMinimumSize()
{
return new Dimension(
img.getWidth(this),
img.getHeight(this)
);
}
// Zeigt das Bild an
public void paint(Graphics g)
{
g.drawImage(img,0,0,this);
}
}
Dann schreibe lieber eine Webstart-Anwendung (.jnlp)
Ansonsten ist die Grundlage für eine "Appletcation" immer ein Applet.
Ein Applet erbt ja von Panel und kann so einem Frame hinzugefügt werden. Dafür muss für den Betrieb als Applikation von deinem Applet eine Instanz erzeugt werden und die init(), start() etc. auf dieser Instanz aufgerufen werden, was ja sonst der Browser macht.
Falls ich das immer noch falsch verstanden habe: ein jar-File wird so in einer HTML-Seite eingebunden:
Er zeigt noch ein paar komische Sachen an, aber es kommt der Sache näher.
Entnehme ich Deinem letzen Link und Forenbeitrag richtig, daß ich mein Applet einer Frame-Applikation zufügen soll, daraus ein *.jar Archiv mache und dann quasi die Applikation mit der HTML Seite starte?
Entnehme ich Deinem letzen Link und Forenbeitrag richtig, daß ich mein Applet einer Frame-Applikation zufügen soll, daraus ein *.jar Archiv mache und dann quasi die Applikation mit der HTML Seite starte?
Du schreibst eine Applet-Klasse, die quasi das Haupt-Panel für die Applikation darstellt.
Und du schreibst eine von Frame abgeleitete Klasse, der du die Applet-Klasse als Component hinzufügst.
Beide Klassen packst du in eine signierte, ausführbare jar-datei, deren Main-Class die Applikations-Klasse ist.
Das HTML-File und das jar-File lädst du dann auf den Webserver, womit du im Internet auf einer Webseite ein Applet aufrufen kannst, während die Kopie der jar-Datei auf dem lokalen System als Aplikation per Doppelklick ausgeführt werden kann.