Java Applet "crashed" im online Betrieb

dErGoO

Grünschnabel
Hallo,
Bin noch neu in Sachen Java und habe folgendes Problem:
Mein Applet (das mal ein einfacher Taschenrechner werden soll) funktioniert offline in Opera, im IExplorer aber nicht. Online behauptet dann auch Opera "Applet crashed"

Online steht das Applet hier: http://www.goo-design.de/java/TR/Taschenrechner_html.html

Quellcode
Datei Taschenrechner.java:

Code:
/** 
 * @author Max Kaufmann 
 * created: 09.10.04 
 */ 

import java.applet.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.border.*; 

public class Taschenrechner extends Applet { 

  public void init () { 
  setBackground(new Color(255,255,255)); 

  JLabel Rechnung; 
  Rechnung = new JLabel(); 
  Rechnung.setPreferredSize(new java.awt.Dimension(250,75)); 
  Rechnung.setMinimumSize(new java.awt.Dimension(250,75)); 
  Rechnung.setText(" Taschenrechner "); 
  Rechnung.setBorder(new LineBorder(Color.lightGray)); 
  Rechnung.setFont(new Font("Verdana", 0, 12)); 
  add(Rechnung); 
   
  JButton[] Buttons = new JButton[17]; 
  String[ ] ButA = { 
  "1", "2", "3", "PlusMinus", "4", "5", "6", "Mal", "7", "8", "9", 
  "Geteilt", "0", "Plus", "Minus", "Gleich" 
  }; 
   
  for (int i = 0; i < ButA.length; i++) { 
    Buttons[i] = new JButton(new ImageIcon("GUI/" + ButA[i] + ".jpg")); 
    Buttons[i].setPressedIcon(new ImageIcon("GUI/" + ButA[i] + "_click.jpg")); 
    Buttons[i].setRolloverEnabled(false); 
    Buttons[i].setPreferredSize(new java.awt.Dimension(60,60)); 
    Buttons[i].setMinimumSize(new java.awt.Dimension(60,60)); 
    Buttons[i].setBorder(null); 
    Buttons[i].setText(null); 
    add(Buttons[i]); 
    ButtonListener BLis = new ButtonListener(Rechnung, ButA[i]); 
    Buttons[i].addActionListener(BLis); 
  } 
  } 
}


Datei ButtonListener.java:

Code:
/** 
 * @author Max Kaufmann 
 * created: 09.10.04 
 */ 

import java.applet.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class ButtonListener implements ActionListener { 
  private JLabel nachrichtL; 
  private String nachrichtT; 

  public ButtonListener(JLabel meldungL, String meldungT) { 
    nachrichtL = meldungL; 
    nachrichtT = meldungT; 
  } 
  public void actionPerformed(ActionEvent ereignis) { 
    nachrichtL.setText(" " + nachrichtT); 
  } 
}

Habe bereits Google+diverse Javaforen durchsucht. Sind irgendwelche Fehler im Quellcode? Liegt es an den jeweiligen Programmversionen (Opera 7.5, IExplorer 6.1, Hab bereits Java SDK's 1.4, 1.42, 1.5 und Runtimes 1.42 und 1.5 probiert, klappt alles nicht), oder gibt es Probleme mit dem Zugriff auf die Bilder im Ordner "GUI"?
Weiß langsam echt nicht mehr weiter, hoffe ihr könnt mir helfen :)

Vielen Dank im vorraus schonmal...
/Max
 
So, nachdem ich mich jetzt den ganzen Tag, und die halbe Nacht durch alle Codeschnipsel gewühlt habe die ich zu diesem Thema finden konnte hab ich endlich ne Lösung für mein Problem! :)

Für alle die ähnliche Schwierigkeiten haben:
Der Fehler wird durch diese zwei Zeilen
Code:
Buttons[i] = new JButton(new ImageIcon("GUI/" + ButA[i] + ".jpg"));
Buttons[i].setPressedIcon (new ImageIcon("GUI/" + ButA[i] + "_click.jpg"));
verursacht. Da Java sehr streng mit Zugriffsrechten für externe Ressourcen verfährt (um vorzubeugen, dass ein Java Applet Daten des Clients auslesen kann), muss erst explizit (also absolut) festgelegt werden, dass die jeweilige Ressource (in meinem Fall das ImageIcon des Buttons) tatsächlich auf dem gleichen Host wie das Applet selbst liegt. Ein relativer Pfad wie oben führt deshalb auch zu dem genannten Problem.
Die Java Konsole gibt deshalb auch
Code:
java.security.AccessControlException access denied
aus. Letztlich funktioniert die folgende Lösung:
Code:
ImageIcon TheIcon = new ImageIcon(getImage(getDocumentBase(), "GUI/" + ButA[i] + ".jpg"));
    ImageIcon TheIcon_click = new ImageIcon(getImage(getDocumentBase(), "GUI/" + ButA[i] + "_click.jpg"));
    Buttons[i] = new JButton(TheIcon);
    Buttons[i].setPressedIcon(TheIcon_click);

Bin mir jetzt gerade nicht ganz sich von welcher Klasse getImage und getDocumentBase abgeleitet sind, aber da mich bei meiner "Lösungssuche" unglaublich genervt hat, dass in den Codeauszügen nie erwähnt wurde, was in die Klasse importiert wird, hier nochmal meine imports:

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.lang.Object.*;
import java.applet.Applet;
import java.net.*;

(sind natürlich nicht alle nötig für das kurze Beispiel...)

Den aktuellen Stand meines Applets findet ihr unter
http://www.goo-design.de/java/TR/

Viele Grüße
/Max
 
Zuletzt bearbeitet:
Zurück