[Java] Probleme mit der Darstellung von Bildern in einem Applet

martin

Well-Known Member
Hi

folgendes Problem: Ich hab ein Applet auf //192.168.0.2/test.class und ein paar Bilder unter //192.168.0.2/images. So wenn ich nun die Bilder laden lassen will mit
Code:
Toolkit.getDefaultToolkit().getImage("images/test.gif")
, dann bekomme ich immer die Fehlermeldung, dass ich keine Berechtigung habe. Ich schätze mal dass, das so seine Richtigkeit hat, wie kann ich jetzt aber Bilder, die im Web verfügbar sind, in meine Anwendung laden?
Oder viel besser noch (wegen Traffic usw.)...Besteht die Möglichkeit durch das Applet auf c:\Programme z.B. einen Ordner zu erstellen und da wiederum alle benötigten Bilder reinzuspeichern?
Dann müsste ich das Laden der Bilder nur noch lokal hinbiegen und es würde ganz nebenbei noch viel schneller laufen.
Wie machen das die Profis? :ugly:

Thx
 
Keine Ahnung wie es die Profis machen aber an deiner Stelle würde ich die Bilder einfach in einen Unterordner mit in das JAR-File von deinem Applet packen. Und dann die Bilder laden mit:

Code:
public abstract class IconLib{
  private static final String rootPath="/icons/";

  public static Image getImageFromFile(String path){
    URL imageURL = IconLib.class.getResource(path);
    //Image img = Toolkit.getDefaultToolkit().getImage(imageURL);
    if(imageURL!=null) return (new ImageIcon(imageURL)).getImage();
    else return null;
  }


  public static BufferedImage createBufferedImage(int size, String path){
    BufferedImage aBI = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = (Graphics2D)aBI.getGraphics();
    Image fileImage = getImageFromFile(path);
    if(fileImage!=null) g.drawImage(fileImage, 0, 0, size, size, null);
    else aBI=null;
    return aBI;
  }
}

Wie du siehst hole ich nicht das Image über die Klasse Toolkit und zwar weil bei dieser Vorgehensweise das Bild seltsamerweise nicht immer geladen wurde. Mit der Klasse ImageIcon funktionierte es jedoch immer. "createBufferedImage" brauchst du eigentlich nur wenn du das Bild als BufferedImage in deinem Programm benötigst ansonsten reicht die andere Methode auch. Ansonsten mal die Klasse ImageIO anschauen, vielleicht ist dort etwas besseres für dich dabei.

Viele Grüße
 
Hi

zunächst mal danke für den Tip. Wie weit ich das verstehe, funktioniert das Ganze aber nur, wenn die Bilder lokal bzw. im selben Verzeichnis vom jar File liegen. Eine "offline" Version des Programmes wird es aber vorerst nicht geben, d.h. ich muss die Bilder irgendwie über das Netz laden. Also das Ganze sieht folgendermaßen aus. Ich hab ein kleines simples Applet, das eigentlich nur das Setzen von ein paar Einstellungen erlaubt. Anschließend wird von diesem Applet heraus ein JFrame erzeugt worin dann das Programm abläuft und wo dann auch die Bilder angezeigt werden sollen.
Am einfachsten wäre es für mich, die Methoden des Applets zu nutzen (getCodeBase()), nur gibt es diese Methode im JFrame leider nicht. Kann ich irgendwie vom erzeugten Frame, auf eine Methode Applet zurückgreifen, ohne das Applet neu erzeugen zu müssen?
 
Am einfachsten wäre es für mich, die Methoden des Applets zu nutzen (getCodeBase()), nur gibt es diese Methode im JFrame leider nicht. Kann ich irgendwie vom erzeugten Frame, auf eine Methode Applet zurückgreifen, ohne das Applet neu erzeugen zu müssen?
Gib doch einfach an der Stelle im Applet an der du das JFrame erzeugst den Rückgabewert von getCodeBase() dem Konstruktor des JFrames mit wenn du es dort benötigst. Oder wenn du noch mehr Methoden benötigst gib doch gleich eine Referenz auf das Applet dem Konstruktor mit.

Viele Grüße
 
Also den Rückgabewert an den Konstruktor des Frames mitzuübergeben geht nicht, weil die sich die Bilder später ändern können.
Was heißt eine "Referenz" an den Konstruktor übergeben? Wie geht das? Sorry kenn mich nicht sooo gut aus.
 
Das ist so wie eine Art Link oder auch Zeiger in anderen Programmiersprachen.
Du legst in deiner eigenen JFrame-Klasse eine Variable auf diese Weise an:
Code:
private JApplet myApplet;

und der Konstruktor deines JFrames würde dann so aussehen:
Code:
public MyJFrame(JApplet aJApplet){
  myApplet = aJApplet;
}

Dann würdest du also den Konstruktor deines JFrame innerhalb deines JApplets so aufrufen:
Code:
MyJFrame myJFrame = new MyJFrame(this);


Nun steht dir eine Referenz auf das JApplet innerhalb deines Frames zur Verfügung und du kannst alle Methoden des JApplets innerhalb deines Frames nutzen.

Viel Erfolg
 
Zurück
Oben