Fehlerflut beim Applet

Nord-Süd-Richtung

Erfahrenes Mitglied
Hi

ich kann das folgende Applet ohne Probleme mit Eclipse starten. Nur wenn ich es im FireFox ausführe, kriege ich folgende Fehler:
java.lang.reflect.InvocationTargetException
at com.sun.deploy.util.DeployAWTUtil.invokeAndWait(Unknown Source)
at sun.plugin2.applet.Plugin2Manager.runOnEDT(Unknown Source)
at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.security.AccessControlException: access denied (java.io.FilePermission background.png 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 gsg9.<init>(gsg9.java:19)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$12.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Ausnahme: java.lang.reflect.InvocationTargetException
java.lang.NullPointerException
at sun.plugin2.applet.Plugin2Manager.findAppletJDKLevel(Unknown Source)
at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Ausnahme: java.lang.NullPointerException

Hier das Applet
Java:
import java.applet.Applet;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;

import java.awt.Image;

import java.awt.Graphics;

import java.awt.Toolkit;



public class gsg9 extends Applet implements ActionListener,KeyListener,Runnable{
	static final long serialVersionUID = 1;
	
	Image imgBackground = Toolkit.getDefaultToolkit().getImage("background.png");
	Image imgPlayer     = Toolkit.getDefaultToolkit().getImage("player.png");
	
	int width     = 400;
	int height    = 400;
	int mapPosX   = 0;
	int mapPosY   = 0;
	int startPosX = 20;
	int startPosY = 20;
	
	int playerPosX = startPosX;
	int playerPosY = startPosY;
	
	String playerName = "Player1";
	
	/* controls */
	final char cmdMoveForward   = KeyEvent.VK_W;
	final char cmdMoveBackwards = KeyEvent.VK_S;
	final char cmdMoveRight     = KeyEvent.VK_D;
	final char cmdMoveLeft      = KeyEvent.VK_A;	
	
	boolean pressedCmdMoveForward   = false;
	boolean pressedCmdMoveBackwards = false;
	boolean pressedCmdMoveRight     = false;
	boolean pressedCmdMoveLeft      = false; 
	
	Player player = new Player(playerName,startPosX,startPosY);
	Thread moveThread = null;	
	public void init(){
		/* layout */
		this.setLayout(null);	
		this.setSize(width,height);
		this.addKeyListener(this);
		moveThread = new Thread(this);
		moveThread.start();
	}	
	public void paint(Graphics g){
		/* constant */
		g.drawImage(imgBackground,mapPosX,mapPosY,this);
		
		/* dynamic */
		g.drawImage(imgPlayer,player.getPosX(),player.getPosY(),this);
	}
	public void actionPerformed(ActionEvent evt){
	}
	public void keyPressed(KeyEvent event){
		int key = event.getKeyCode();
	    if( key == cmdMoveForward)
	    	pressedCmdMoveForward = true;	    
	    if( key == cmdMoveBackwards)
	    	pressedCmdMoveBackwards = true;
	    if( key == cmdMoveLeft)
	    	pressedCmdMoveLeft = true;
	    if( key == cmdMoveRight)
	    	pressedCmdMoveRight = true;	    	    
	}
	public void keyReleased(KeyEvent event){	
		int key = event.getKeyCode();
	    if( key == cmdMoveForward)
	    	pressedCmdMoveForward = false;	    
	    if( key == cmdMoveBackwards)
	    	pressedCmdMoveBackwards = false;
	    if( key == cmdMoveLeft)
	    	pressedCmdMoveLeft = false;
	    if( key == cmdMoveRight)
	    	pressedCmdMoveRight = false;
	}
	public void keyTyped(KeyEvent event){
	}
	public void movePlayer(){
		int posX = player.getPosX();
		int posY = player.getPosY();
		if( pressedCmdMoveForward ){
			if( posY > 0 )
				player.setPosY(posY-2);
		}
		if( pressedCmdMoveBackwards ){
			if( posY < 400 )
				player.setPosY(posY+2);
		}
		if( pressedCmdMoveLeft ){
			if( posX > 0 )
				player.setPosX(posX-2);
		}
		if( pressedCmdMoveRight ){
			if( posX < 400 )
				player.setPosX(posX+2);
		}
		repaint();
	}
	public void run(){
		Thread currentThread = Thread.currentThread();
		while( moveThread == currentThread){
			try{
				Thread.sleep(50);
			}
			catch(InterruptedException e){
				
			}
			movePlayer();
		}
	}
}
 
Hallo,

das liegt daran, dass du versuchst Dateien von der Festplatte zu öffnen und das darf dein Programm standardmäßig als Applet nicht.

Gruß

Sascha
 
Naja, wenn das Applet bei vielen Leuten laufen soll, was ich ja mal annehme, sonst gäbe es ja kein Grund für ein Applet, müssten die Rechte bei allen Clients die das Programm ausführen geändert werden.
Wenn ich aber richtig sehe, sind es Bilder die im Programm dargestellt werden sollen und die der Nutzer nicht ändern soll. Dann pack das ganze doch in eine Jar und lade die Bilder aus der Jar-File.


Gruß

Sascha
 
Hi

leider bin ich noch ziemlicher Anfänger was Java angeht. Ich habe mich jetzt mal durch etliche Foren gegoogelt und diesen Code zusammen gebastelt. Jedoch erhalte ich eine NullPointerException.
Java:
try{
  JarFile image = new JarFile("../img/images.jar");
  ByteArrayOutputStream os = new ByteArrayOutputStream();
  InputStream is =  image.getInputStream(new JarEntry("imgBackground.png"));
  int temp;
  while(( temp = is.read()) >= 0)
    os.write(temp);
  imgBackground = Toolkit.getDefaultToolkit().getImage(os.toString());			
}
catch(IOException e){
  System.out.println("ERROR: "+e.toString());
}	
catch(Exception e){
  System.out.println("ERROR: "+e.toString());
}

Das JarFile habe ich durch die ExportFunktion von Eclipse erstellt.
 
Du solltest das ganze Applet in ein Jar-File packen.

Dann kannst du einfach mit
Code:
ImageIcon icon = new ImageIcon(ClassLoader.getSystemResource("pfad zum image"));

das Bild laden.

Gruß

Sascha
 
Hi

danke für den Tipp, ich habe es sogar irgendwie geschafft das ganze in Eclipse zu starten und es funktionierte :) Nur habe ich jetzt Probleme es im Browser auszuführen. Ich habe folgenden Code gefunden:
HTML:
<applet codebase = "./" archive = "gsg9.jar" code = "gsg9.class" name = "gsg9">

Ich erhalte eine komplett weiße Seite :( Das JavaApplet scheint zwar geladen zu werden (ich kann auf einer Fläche keinen Rechtsklick amchen) aber es erscheint weder meine Spielfigur, noch mein Hintergrund.
 
Hi

ich bins nochmal. Ich Depp bin garnicht auf die Idee gekommen das das Applet doch geladen hatte. Ich habe die Hintergrundfarbe mal auf rot gesetzt und ich hatte ein rotes Rechteck im Browser. Allerdings fehlen die Bilder, die anderen Funktionen klappen.
Meine Ordner Struktur in Eclipse:
Code:
gsg9
|---src
     |---Default Package
          |---gsg9.java
          |---[...]
|---JRE System Libary[jre6]
|---gfx
     |---background.png
     |---player.png
|---gsg9.jar
Meine Codezeilen zum Bilder laden:
Java:
ImageIcon iconBackground = new ImageIcon(ClassLoader.getSystemResource("../gfx/background.png"));
			imgBackground 			 = iconBackground.getImage();
			ImageIcon iconPlayer 	 = new ImageIcon(ClassLoader.getSystemResource("../gfx/player.png"));
			imgPlayer 				 = iconPlayer.getImage();
Ich habe wirklich schon alles mögliche probiert, aber weder in Eclipse noch im Browser wird es richtig angezeigt :(
 
Zurück