Applet läuft nicht in Browser

Pikkolini

Mitglied
Also am Anfang, ich wusste nicht, wo ich das Thema machen sollte, also habe ich es mal hier gemacht.
Ich hab folgendes Problem: Ich hab jetzt mit Eclipse ein Applet programmiert und das läuft auch alles solang ich es über Eclipse laufen lasse. Wenn ich es aber im Browser laufen lassen möchte gibt Java immer folgene Fehlermeldung raus:

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

Kann mir einer sagen was das heißt, und wie man das beheben kann?
 

Pikkolini

Mitglied
Als class so:

HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hier Titel eintragen</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
</head>
<body>
<applet code="Main.class" width="400" height="300"></applet>  <!-- Bei code habe ich auch andere Angaben probiert -->
</body>
</html>

und als Jar so:

HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hier Titel eintragen</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
</head>
<body>
<applet code="ball/Main.class" archives="ball.jar" width="400" height="300"></applet> <!-- Bei code habe ich wieder mehrer Varianten probiert -->
</body>
</html>

Müsste eigentlich so stimmen.

PS: Weniger aufwändige Applets klappen so
 

Pikkolini

Mitglied
Ja aber ich habe es auch mal mit ball.Main.class oder ball/Main.class versucht.
Und bei simplen Applets, die nicht viel machen klappt es eigentlich auch.
 

U2nt

Bekanntes Mitglied
Wärst du so nett mal den Code vom Applet zu posten?
Ne NullPointerException kann sehr wahrscheinlich von nem falschen Code im Applet kommen.
 

Pikkolini

Mitglied
Java:
package ball;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.util.*;
import javax.swing.*;

public class Main extends JApplet implements ImageObserver {
	
	private static final long serialVersionUID = 1L;
	private Animation animation = new Animation();
	private Time time = new Time();
	private Thread tha = new Thread(animation);
	private Thread thb = new Thread(time);
	private MyListener handler = new MyListener();
	private MediaTracker mt = new MediaTracker(this); 
	private static Image bild1 = Toolkit.getDefaultToolkit().getImage("c:\\Java\\Test\\Ball\\ball1.png");
	private static Image bild2 = Toolkit.getDefaultToolkit().getImage("c:\\Java\\Test\\Ball\\ball2.png");
	private static int appletsize_x = 400;
    private static int appletsize_y = 300;
    private static int boden = 20;
    private static int x_pos1 = 200;
    private static int y_pos1 = 200;
    private static int radius1 = 0;
    private static boolean up1 = false;
    private static boolean down1 = false;
    private static boolean right1 = false;
    private static boolean left1 = false;
    private static int x_pos2 = 0;
    private static int y_pos2 = 0;
    private static int radius2 = 10;
    private static boolean neu = true;
    private static int zeit = 30;

    // Zeit berechnen
    public static int getTime() {
		return zeit;	
    }
    protected static void setTime(int z) {
    	zeit = zeit + z;
    }
    // Bilder laden
    protected static Image getImage1() {
		return bild1;
    }
    protected static Image getImage2() {
		return bild2;
    }
    // Größe des Applets ermitteln
    protected static int getAppletsize_x() {
    	return appletsize_x;
    }
    protected static int getAppletsize_y() {
    	return appletsize_y;
    }
    protected static int getGround() {
    	return boden;
    }
    // Daten für Spielerball
    protected static int getX_pos1() {
    	return x_pos1;
    }
    protected static void setX_pos1(int z) {
    	x_pos1 = x_pos1 + z;
    }
    protected static int getY_pos1() {
    	return y_pos1;
    }
    protected static void setY_pos1(int z) {
    	y_pos1 = y_pos1 + z;
    }
    protected static int getRadius1() {
    	return radius1;
    }
    protected static void setRadius1(int z) {
    	radius1 = z;
    }
    protected static boolean getUp() {
    	return up1;
    }
    protected static void setUp(boolean b) {
    	up1 = b;
    }
    protected static boolean getDown() {
    	return down1;
    }
    protected static void setDown(boolean b) {
    	down1 = b;
    }
    protected static boolean getRight() {
    	return right1;
    }
    protected static void setRight(boolean b) {
    	right1 = b;
    }
    protected static boolean getLeft() {
    	return left1;
    }
    protected static void setLeft(boolean b) {
    	left1 = b;
    }
    // Daten für Computerball
    protected static int getX_pos2() {
    	return x_pos2;
    }
    protected static void setX_pos2(int z) {
    	x_pos2 = z;
    }
    protected static int getY_pos2() {
    	return y_pos2;
    }
    protected static void setY_pos2(int z) {
    	y_pos2 = z;
    }
    protected static int getRadius2() {
    	return radius2;
    }
    protected static void setRadius2(int z) {
    	radius2 = z;
    }
    protected static boolean getNew() {
    	return neu;
    }
    protected static void setNew(boolean b) {
    	neu = b;
    }
    
    public void init() {
    	this.setSize(getAppletsize_x(),getAppletsize_y());
    	this.addKeyListener(handler);
    	mt.addImage(bild1, 0);
    	mt.addImage(bild2, 1);
    	try {
    		mt.waitForID(0);
    		mt.waitForID(1);
    	} catch (InterruptedException ex) {
    		ex.printStackTrace();
    	}
    	radius1 = bild1.getWidth(this) / 2;
    	radius2 = bild2.getWidth(this) / 2;
    	try {
    		SwingUtilities.invokeAndWait(new Runnable() {
    			public void run() {
    				add(animation);
    			}
    		});
    	} catch (Exception ex) {
    		ex.printStackTrace();
    	}
    }
    
    public void start() {
        tha.start();
        thb.start();
    }
}

// Animation des Balles
class Animation extends JPanel implements Runnable {
	
	private static final long serialVersionUID = 1L;
	private Random r = new Random();
	private int sx = 0;
	private int sy = 0;
	private int radius = 0;
	private int setx = 0;
	private int sety = 0;
	private int punkte = 0;
    
    public void run() {
        while (true) {
        	if ((Main.getUp() == true) && (Main.getY_pos1() > Main.getRadius1())) {
        		Main.setY_pos1(-1);
        	}
        	if ((Main.getDown() == true) && (Main.getY_pos1() < Main.getAppletsize_y() - Main.getGround() - Main.getRadius1())) {
        		Main.setY_pos1(1);
        	}
        	if ((Main.getLeft() == true) && (Main.getX_pos1() > Main.getRadius1())) {
        		Main.setX_pos1(-1);
        	}
        	if ((Main.getRight() == true) && (Main.getX_pos1() < Main.getAppletsize_x() - Main.getRadius1())) {
        		Main.setX_pos1(1);
        	}
        	// x-Abstand wird berechnet
        	sx = Main.getX_pos1() - Main.getX_pos2();
        	if (sx < 0) {
        		sx = Main.getX_pos2() - Main.getX_pos1();
        	}
        	// y-Abstand wird berechnet
        	sy = Main.getY_pos1() - Main.getY_pos2();
        	if (sy < 0) {
        		sy = Main.getY_pos2() - Main.getY_pos1();
        	}
        	// Computerball wird getroffen
        	radius = Main.getRadius1() + Main.getRadius2();
        	if ((sx * sx + sy * sy < radius * radius) || Main.getNew() == true) {
        		// Computerball wird neu gesetzt bis er nicht mehr den anderen Ball berührt
        		do {
        			setx = r.nextInt(Main.getAppletsize_x() - 2 * Main.getRadius2()) + Main.getRadius2();
        		} while ((setx >= Main.getX_pos1() - Main.getRadius1()) && (setx <= Main.getX_pos1() + Main.getRadius1()));
        		do {
        			sety = r.nextInt(Main.getAppletsize_y() - Main.getGround() - 2 * Main.getRadius2()) + Main.getRadius2();
        		} while ((sety >= Main.getY_pos1() - Main.getRadius1()) && (sety <= Main.getY_pos1() + Main.getRadius1()));
        		// neue Position wird übernommen
        		Main.setX_pos2(setx);
        		Main.setY_pos2(sety);
        		// pro Hit ein Punkt, maximal 9999
        		if ((punkte < 9999) && (Main.getNew() == false)) {
        			punkte++;
        		}
        		Main.setNew(false);
        	}
            repaint();
            try {
                Thread.sleep(5);
            } catch (InterruptedException ex) {
            }
        }
    }
    // Bildschirm wird bemalt
    public void paintComponent(final Graphics g) {
        super.paintComponent(g);
        if (Main.getTime() > 0) {
        	g.setColor(new Color(0,200,200));
        	g.fillRect(0, 0, Main.getAppletsize_x(), Main.getAppletsize_y() - Main.getGround());
        	g.setColor(new Color(0, 255, 0));
        	g.fillRect(0, Main.getAppletsize_y() - Main.getGround(), Main.getAppletsize_x(), Main.getGround());
        	g.drawImage(Main.getImage1(), Main.getX_pos1() - Main.getRadius1(), Main.getY_pos1() - Main.getRadius1(), this);
        	g.drawImage(Main.getImage2(), Main.getX_pos2() - Main.getRadius2(), Main.getY_pos2() - Main.getRadius2(), this);
        	g.setColor(Color.yellow);
        	g.drawString("Punkte : " + punkte, Main.getAppletsize_x() - 80, 20);
        	g.drawString("Zeit: " + Main.getTime(), 20, 20);
        }
        if (Main.getTime() == 0) {
        	g.setColor(new Color(0,200,200));
        	g.fillRect(0, 0, Main.getAppletsize_x(), Main.getAppletsize_y() - Main.getGround());
        	g.setColor(new Color(0, 255, 0));
        	g.fillRect(0, Main.getAppletsize_y() - Main.getGround(), Main.getAppletsize_x(), Main.getGround());
        	g.setColor(Color.red);
        	g.setFont(new Font("Arial", Font.BOLD, 26));
        	g.drawString("E N D E", Main.getAppletsize_x() / 2 - 40, Main.getAppletsize_y() / 2);
        }
    }
}

// Spiel-Timer
class Time implements Runnable {
	public void run() {
		while (true) {
			if (Main.getTime() > 0) {
				Main.setTime(-1);
			}
			try {
				Thread.sleep(1000);
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}
	}
}

// KeyListener zum Bewegen durch Tastatur
class MyListener implements KeyListener
{    	
	public void keyPressed(KeyEvent e) {		
		switch(e.getKeyCode()) {
		case KeyEvent.VK_UP:
			Main.setUp(true);
			break;
		case KeyEvent.VK_DOWN:
			Main.setDown(true);
			break;
		case KeyEvent.VK_LEFT:
			Main.setLeft(true);
			break;
		case KeyEvent.VK_RIGHT:
			Main.setRight(true);
			break;
		}
	}
	
	public void keyReleased(KeyEvent e){
		switch(e.getKeyCode()) {
		case KeyEvent.VK_UP:
			Main.setUp(false);
			break;
		case KeyEvent.VK_DOWN:
			Main.setDown(false);
			break;
		case KeyEvent.VK_LEFT:
			Main.setLeft(false);
			break;
		case KeyEvent.VK_RIGHT:
			Main.setRight(false);
			break;
		}
	}
	
	public void keyTyped(KeyEvent e){}
}

Das Applet ist noch vom Sinn her teilweise unvollständig, müsste aber eigentlich so klappen.
 

OliverKroll

Aktives Mitglied
Ich habe dein Programm soweit zum Laufen bekommen, daß der Ende-Bildschirm angezeigt wird.
Was genau das Problem war, kann ich nicht sagen.
Die Bilder haben einen absoluten Pfad (den du natürlich nicht mitliefern konntest) und sind deswegen von mir entfernt worden.
Die Zeile SwingUtilities.invokeAndWait ... solltest du dir im SDK noch einmal anschauen (Java Platform SE 6), damit habe ich noch nie programmiert, aber so wie es aussieht, brauchst du zwei neue Threads, um die Methode richtig zu starten.

Was noch fehlt, ist, daß dein Programm von vorn anfängt und bei 30 Sekunden übrigbleibender Spielzeit anfängt zu zählen. Das wirst du bestimmt selber hinbekommen.

Bei der Fehlersuche ist mir wieder einmal aufgefallen, daß Daten und Java-Klassen im Cache gespeichert bleiben und statt der neuen, berichtigten Klassen immer noch die alten, fehlerhaften Klassen verwendet wurden. Es bleibt dir, wenn der Fehler wieder einmal auftritt, nicht viel übrig, als den Browser immer wieder zu beenden und neu zu starten.

Erst hatte ich das Applet mit Firefox aufgerufen, bin dann aber auf Opera umgestiegen, weil die Fehlermeldungen hier aussagekräftiger waren.

Ich habe dein Programm in vier Klassen zerlegt:
Main.java
Java:
package ball;

//import java.awt.;
import java.awt.event.*;
import java.awt.image.*;
import java.util.*;
import javax.swing.*;
import java.applet.*;
 
public class Main
extends JApplet
implements ImageObserver 
{
    
    private static final long serialVersionUID = 1L;
    private Animation2 animation = new Animation2();
    private Time2 time = new Time2();
    private Thread tha = new Thread(animation);
    private Thread thb = new Thread(time);
    private MyListener2 handler;// = new MyListener();
 /*  private MediaTracker mt;// = new MediaTracker(this);*/ 
    private static BufferedImage bild1;// = Toolkit.getDefaultToolkit().getImage("c:\\Java\\Test\\Ball\\ball1.png");
    private static BufferedImage bild2;// = Toolkit.getDefaultToolkit().getImage("c:\\Java\\Test\\Ball\\ball2.png");*/
    private static int appletsize_x = 400;
    private static int appletsize_y = 300;
    private static int boden = 20;
    private static int x_pos1 = 200;
    private static int y_pos1 = 200;
    private static int radius1 = 0;
    private static boolean up1 = false;
    private static boolean down1 = false;
    private static boolean right1 = false;
    private static boolean left1 = false;
    private static int x_pos2 = 0;
    private static int y_pos2 = 0;
    private static int radius2 = 10;
    private static boolean neu = true;
    private static int zeit = 30;
    
 
    // Zeit berechnen
    public static int getTime() 
    {
        return zeit;    
    }
    
    public static void setTime(int z) 
    {
        zeit = zeit + z;
    }
    
    // Bilder laden
    public static BufferedImage getImage1() 
    {
        return bild1;
    }
    
    public static BufferedImage getImage2() 
    {
        return bild2;
    }
    
    // Größe des Applets ermitteln
    public static int getAppletsize_x() 
    {
        return appletsize_x;
    }
    
    public static int getAppletsize_y() 
    {
        return appletsize_y;
    }
    
    public static int getGround() 
    {
        return boden;
    }
    
    // Daten für Spielerball
    public static int getX_pos1() 
    {
        return x_pos1;
    }
    
    public static void setX_pos1(int z) 
    {
        x_pos1 = x_pos1 + z;
    }
    
    public static int getY_pos1() 
    {
        return y_pos1;
    }
    
    public static void setY_pos1(int z) 
    {
        y_pos1 = y_pos1 + z;
    }
    
    public static int getRadius1() 
    {
        return radius1;
    }
    
    public static void setRadius1(int z) 
    {
        radius1 = z;
    }
    
    public static boolean getUp() 
    {
        return up1;
    }
    
    public static void setUp(boolean b) 
    {
        up1 = b;
    }
    
    public static boolean getDown() 
    {
        return down1;
    }
    
    public static void setDown(boolean b) 
    {
        down1 = b;
    }
    
    public static boolean getRight() 
    {
        return right1;
    }
    
    public static void setRight(boolean b) 
    {
        right1 = b;
    }
    
    public static boolean getLeft() 
    {
        return left1;
    }
    
    public static void setLeft(boolean b) 
    {
        left1 = b;
    }
    
    // Daten für Computerball
    public static int getX_pos2() 
    {
        return x_pos2;
    }
    
    public static void setX_pos2(int z) 
    {
        x_pos2 = z;
    }
    
    public static int getY_pos2() 
    {
        return y_pos2;
    }
    
    public static void setY_pos2(int z) 
    {
        y_pos2 = z;
    }
    
    public static int getRadius2() 
    {
        return radius2;
    }
    
    public static void setRadius2(int z) 
    {
        radius2 = z;
    }
    
    public static boolean getNew() 
    {
        return neu;
    }
    
    public static void setNew(boolean b) 
    {
        neu = b;
    }
   
	
    public void init()
    {
        this.setSize(getAppletsize_x(),getAppletsize_y());
        this.addKeyListener(handler);
        bild1=new BufferedImage(1,1,BufferedImage.TYPE_INT_RGB);
        bild2=new BufferedImage(1,1,BufferedImage.TYPE_INT_RGB);
     /*   mt.addImage(bild1, 0);
        mt.addImage(bild2, 1);
        try
        {
            mt.waitForID(0);
            mt.waitForID(1);
        }
        catch (InterruptedException ex) 
        {
            ex.printStackTrace();
        }*/
        radius1 = bild1.getWidth(this) / 2;
        radius2 = bild2.getWidth(this) / 2;
        
        new Thread(new Runnable()
        {
        	public void run()
        	{
        		try 
        		{
        			SwingUtilities.invokeAndWait(new Runnable() 
        			{
        				public void run() 
        				{
        					add(animation);
        				}
        			});
        		} 
        		catch (Exception ex) 
        		{
        			ex.printStackTrace();
        			ex.printStackTrace();
        		}
        	}
        }).start();
    }
    
    public void start() 
    {
        tha.start();
        thb.start();
    }
}

Animation2:
Java:
package ball;

import java.awt.*;
import java.util.Random;

import javax.swing.JPanel;

public class Animation2
extends JPanel
implements Runnable 
{
    
    private static final long serialVersionUID = 1L;
    private Random r = new Random();
    private int sx = 0;
    private int sy = 0;
    private int radius = 0;
    private int setx = 0;
    private int sety = 0;
    private int punkte = 0;
    
    public void run()
    {
        while (true)
        {
            if ((Main.getUp() == true) && (Main.getY_pos1() > Main.getRadius1())) 
            {
                Main.setY_pos1(-1);
            }
            if ((Main.getDown() == true) && (Main.getY_pos1() < Main.getAppletsize_y() - Main.getGround() - Main.getRadius1())) 
            {
                Main.setY_pos1(1);
            }
            if ((Main.getLeft() == true) && (Main.getX_pos1() > Main.getRadius1())) 
            {
                Main.setX_pos1(-1);
            }
            if ((Main.getRight() == true) && (Main.getX_pos1() < Main.getAppletsize_x() - Main.getRadius1())) 
            {
                Main.setX_pos1(1);
            }
            // x-Abstand wird berechnet
            sx = Main.getX_pos1() - Main.getX_pos2();
            if (sx < 0) 
            {
                sx = Main.getX_pos2() - Main.getX_pos1();
            }
            // y-Abstand wird berechnet
            sy = Main.getY_pos1() - Main.getY_pos2();
            if (sy < 0) {
                sy = Main.getY_pos2() - Main.getY_pos1();
            }
            // Computerball wird getroffen
            radius = Main.getRadius1() + Main.getRadius2();
            if ((sx * sx + sy * sy < radius * radius) || Main.getNew() == true) 
            {
                // Computerball wird neu gesetzt bis er nicht mehr den anderen Ball berührt
                do 
                {
                    setx = r.nextInt(Main.getAppletsize_x() - 2 * Main.getRadius2()) + Main.getRadius2();
                } while ((setx >= Main.getX_pos1() - Main.getRadius1()) && (setx <= Main.getX_pos1() + Main.getRadius1()));
                do
                 {
                    sety = r.nextInt(Main.getAppletsize_y() - Main.getGround() - 2 * Main.getRadius2()) + Main.getRadius2();
                } while ((sety >= Main.getY_pos1() - Main.getRadius1()) && (sety <= Main.getY_pos1() + Main.getRadius1()));
                // neue Position wird übernommen
                Main.setX_pos2(setx);
                Main.setY_pos2(sety);
                // pro Hit ein Punkt, maximal 9999
                if ((punkte < 9999) && (Main.getNew() == false)) 
                {
                    punkte++;
                }
                Main.setNew(false);
            }
            repaint();
            try 
            {
                Thread.sleep(5);
            }
             catch (InterruptedException ex) 
             {
            
            }
        }
    }

    // Bildschirm wird bemalt
    public void paintComponent(final Graphics g) 
    {
        super.paintComponent(g);
        if (Main.getTime() > 0) 
        {
            g.setColor(new Color(0,200,200));
            g.fillRect(0, 0, Main.getAppletsize_x(), Main.getAppletsize_y() - Main.getGround());
            g.setColor(new Color(0, 255, 0));
            g.fillRect(0, Main.getAppletsize_y() - Main.getGround(), Main.getAppletsize_x(), Main.getGround());
            g.drawImage(Main.getImage1(), Main.getX_pos1() - Main.getRadius1(), Main.getY_pos1() - Main.getRadius1(), this);
            g.drawImage(Main.getImage2(), Main.getX_pos2() - Main.getRadius2(), Main.getY_pos2() - Main.getRadius2(), this);
            g.setColor(Color.yellow);
            g.drawString("Punkte : " + punkte, Main.getAppletsize_x() - 80, 20);
            g.drawString("Zeit: " + Main.getTime(), 20, 20);
        }
        if (Main.getTime() == 0) 
        {
            g.setColor(new Color(0,200,200));
            g.fillRect(0, 0, Main.getAppletsize_x(), Main.getAppletsize_y() - Main.getGround());
            g.setColor(new Color(0, 255, 0));
            g.fillRect(0, Main.getAppletsize_y() - Main.getGround(), Main.getAppletsize_x(), Main.getGround());
            g.setColor(Color.red);
            g.setFont(new Font("Arial", Font.BOLD, 26));
            g.drawString("E N D E", Main.getAppletsize_x() / 2 - 40, Main.getAppletsize_y() / 2);
        }
    }
}

MyListener2:
Java:
package ball;

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

public class MyListener2
implements KeyListener
{       
    public void keyPressed(KeyEvent e) 
    {        
        switch(e.getKeyCode()) 
        {
        case KeyEvent.VK_UP:
            Main.setUp(true);
            break;
        case KeyEvent.VK_DOWN:
            Main.setDown(true);
            break;
        case KeyEvent.VK_LEFT:
            Main.setLeft(true);
            break;
        case KeyEvent.VK_RIGHT:
            Main.setRight(true);
            break;
        }
    }
    
    public void keyReleased(KeyEvent e)
    {
        switch(e.getKeyCode()) 
        {
        case KeyEvent.VK_UP:
            Main.setUp(false);
            break;
        case KeyEvent.VK_DOWN:
            Main.setDown(false);
            break;
        case KeyEvent.VK_LEFT:
            Main.setLeft(false);
            break;
        case KeyEvent.VK_RIGHT:
            Main.setRight(false);
            break;
        }
    }
    
    public void keyTyped(KeyEvent e)
    {
    	
    }
}

Time2:
Java:
package ball;

public class Time2
implements Runnable 
{
    public void run() 
    {
        while (true) 
        {
            if (Main.getTime() > 0) 
            {
                Main.setTime(-1);
            }
            try 
            {
                Thread.sleep(1000);
            }
            catch (InterruptedException ex) 
            {
                ex.printStackTrace();
            }
        }
    }
}

Laß mal von dir hören, wenn das Programm fertig ist.
Dann aber besser eine ZIP-Datei beilegen, damit auch die Bilder mit dabei sind.

Edit: Ich habe das Programm eben noch einmal mit Firefox und Opera gestartet: das Programm fängt jetzt doch bei 30 Sekunden Anfangszeit an zu zählen - das liegt eben am Cache, in dem vorher noch die alten Java-Klassen waren.

Edit: Jetzt ist im bin-Ordner noch die HTML-Datei mit dabei.
 
Zuletzt bearbeitet:

L-ectron-X

Gesperrter Benutzer
Noch eine Anmerkung von mir: In Applets und schon gar nicht in JApplets sollten Bilder mit dem Toolkit geladen werden.
In Applets ist die Variante mit einem vorgeschalteten MediaTracker zu bevorzugen, der sicherstellt, dass die Bilder wirklich geladen sind, bevor sie gezeichnet werden. Zum Laden der Bilder ist dann die getImage()-Methode aus Applet benutzen, nicht das Toolkit.
In JApplets können wir auf den MediaTracker verzichten, wenn wir Bilder mit den wesentlich effizienteren ImageIO-Klassen die Bilder laden. Hier ist dann eine passende read()-Methode auszuwählen.
 
Zuletzt bearbeitet:

Pikkolini

Mitglied
Danke an euch beide für die tolle Hilfe :)

Also ich habe jetzt mal den Code von Oliver bei mir kopert und ihn ein bisschen angepasst.
Bis dahin lief dann alles. Dann habe ich mit dem Tipp L-ectron-X es mal mit ImageIO probiert, da ich aber keine Ahnung von BufferedImage oder ImageIO habe, habe ich mal ein bisschen gegooglet und mir das hier zusammengewürfelt:
Java:
File bild11 = new File("c:\\Java\\Test\\Ball\\ball1.png");
File bild22 = new File("c:\\Java\\Test\\Ball\\ball2.png");
try {
	bild1 = ImageIO.read(bild11);
	bild2 = ImageIO.read(bild22);
} catch (IOException ex) {
	ex.printStackTrace();
}

Die absoluten Pfäde sind übrigens nur zum Test.
Wieder in Eclipse getestet und die Bälle waren da, konnte sie aber nicht bewegen. Also habe ich aus
Java:
private MyListener2 handler;// = new MyListener();

Java:
private MyListener2 handler = new MyListener2();

gemacht. Wieso wurde das überhaupt auskommentiert?
So in Eclipse getestet und es lief. Dann alles in Firefox getestet aber der hat mir folgene Meldung angezeigt:

java.security.AccessControlException: access denied (java.io.FilePermission c:\Java\Test\Ball\ball1.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 java.io.File.canRead(Unknown Source)
at javax.imageio.ImageIO.read(Unknown Source)
at ball2.Main2.init(Main2.java:198)
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 c:\Java\Test\Ball\ball1.png read)

Dass ganze in Opera getestet und Opera hat nur "Applet crashed!" rausgerückt. Wie komme ich an die Fehlermeldungen bei Opera? Ich arbeite sonst nie damit.

Außerdem ist mir bei meinem alten Applet aufgefallen, dass es nach dem Compilieren nicht nur eine Main.class sondern auch eine Main$1.class gibt. Bei decompilieren kam folgendes raus:
Java:
package ball;


// Referenced classes of package ball:
//            Main

class Main$1
    implements Runnable
{

    public void run()
    {
        add(Main.access$0(Main.this));
    }

    final Main this$0;

    Main$1()
    {
        this$0 = Main.this;
        super();
    }
}

woraus ich aber irgendwie nicht schlau werden kann. Hab dann mal versucht die Main$1.class über den Browser zu starten, kam aber auch nur mist raus.

Ich habe jetzt mal alles inklusive Bilder in ein Zip gepackt und angehängt.

PS: Habe gerade noch gemerkt das bei es bei dem neuen Applet einmal noch Main2$1.class und Main2$1$1.class gibt ???:L
 
Zuletzt bearbeitet:

OliverKroll

Aktives Mitglied
Die Zeile
Java:
private MyListener2 handler = new MyListener2();
hatte ich übersehen, war nur während der Fehlersuche auskommentiert.

Die AccessPermission tritt nicht auf, wenn du lokale Pfade verwendest, also die Bilder in einem Java-Package speicherst (bei mir: "bilder"):
Java:
File bild11 = new File("bilder/ball1.png");
File bild22 = new File("bilder/ball2.png");
try
{
    bild1 = ImageIO.read(bild11);
    bild2 = ImageIO.read(bild22);
}
catch (IOException ex) 
{
    ex.printStackTrace();
}

Die Fehlermeldungen stehen bei Opera 10.10 in Extras->Weiteres->Java-Console. (Eigentlich kann hier auch nur der StackTrace ausgegeben werden, aber mir kam es vor, daß Firefox einmal von einem GLContext sprach (ist bei normalem Java eigentlich doch unmöglich) und Opera von einem NoClassDefFoundError.)

Die Dollarzeichen im Klassennamen ("Main$1.class ") entstehen, wenn in einer Klassen-Source-Datei mehrere Klassen angegeben werden:
Java:
public class Main
{
...
}

class Animation
{
...
}

Die Klasse Animation bekäme ungefähr den Namen "Main$Animation.class". Die "1" ("Main$1.class") entsteht bei Verwendung anonymer Klassen:
Java:
new Thread(new Runnable()
{
    public void run()
    {
        ....
    }
}).start();

Wenn du Lust hast, kannst du noch einen Blick auf meine Homepage werfen (Olivers Seite) mit vier einfachen Videospielen (Beitrag vor einem Jahr:http://www.java-forum.org/spiele-mu...-spiele-applets-anregung-meiner-homepage.html).
 

Pikkolini

Mitglied
Danke Oliver, endlich weiß ich was dieses $-Zeichen sind :)
Aber das mit den lokalen Pfaden klappt nicht Opera und Firefox spucken immernoch die gleichen Meldungen aus, auch nach neu starten ???:L

PS: Die Seite werde ich mir morgen mal in Ruhe anschauen ;)

EDIT: Jetzt habe ich einmal dein Applet geöffnet und prompt klappt auch meins, und das obwohl ich auch schon vorher ein paar mal Firefox neu gestartet habe...
Allerdings ruckelt das Applet ziemlich, und läuft nicht flüssig...
 
Zuletzt bearbeitet:

OliverKroll

Aktives Mitglied
Ich habe bei mir eben mein Applet aus der HTML-Datei im bin-Ordner starten können, allerdings muß man bei Opera manchmal die Seite noch einmal neu laden, damit das Applet tatsächlich startet.
Firefox prüft seit einiger Zeit die Java-Policy (Opera anscheinend nicht), habe ich eben von Hand eingetragen: geht jetzt auch.
 
Zuletzt bearbeitet:

L-ectron-X

Gesperrter Benutzer
Auf File sollte bei der Verwendung in Applets abgesehen werden, es sei denn man möchte sich mit AccessControlExceptions herum schlagen. ;) File greift auf die lokale Verzeichnisebene zu, was ja bekanntermaßen unsignierten Applets verboten ist.
File wird aber auch gar nicht gebraucht. Besser: Gleich in ein Image (Bufferedmage) laden
Schau dir mal die read()-Methoden an, die von ImageIO bereitgestellt werden, da sind die passenden dabei.
Also: File weg!

Ich wills jetzt auch nicht weiter spannend machen und um den heißen Brei herum reden, deshalb noch gleich etwas Code nachgeschoben, der in deinem Fall so aussehen kann:
Java:
...
   private Image bild1, bild2;

   public void init() {
      try {
         bild1 = ImageIO.read(new URL(getCodeBase()+"bilder/ball1.png"));
         bild2 = ImageIO.read(new URL(getCodeBase()+"bilder/ball2.png"));
      }
      catch(MalformedURLException murle) {
         murle.printStackTrace();
      }
      catch(java.io.IOException ioe) {
         ioe.printStackTrace();
      }
   }
...
}
Kein File, keine AccessControlException, kein signieren.
 
Zuletzt bearbeitet:

Pikkolini

Mitglied
Danke, klappt gut, allerdings ruckelt das Spiel jetzt ziemlich.
Ich habe mal aus
Java:
new Thread(new Runnable()
        {
            public void run()
            {
                try 
                {
                    SwingUtilities.invokeAndWait(new Runnable() 
                    {
                        public void run() 
                        {
                            add(animation);
                        }
                    });
                } 
                catch (Exception ex) 
                {
                    ex.printStackTrace();
                    ex.printStackTrace();
                }
            }
        }).start();

Java:
try {
        	SwingUtilities.invokeAndWait(new Runnable() {
        		public void run() {
        			add(animation);
        		}
        	});
        } 
        catch (Exception ex) {
        	ex.printStackTrace();
        }

gemacht, in der hoffnung, das es flüssiger läuft. Wieso wurde überhaupt ein Thread draus gemacht?
Allerdings ruckelt das Applet genauso wie vorher, weiß aber nicht wieso.
 

OliverKroll

Aktives Mitglied
Beachtlich ;).
Im Ende-Bildschirm fehlen die Punkte (das Endergebnis ("Habe ich gewonnen oder verloren ? Bin ich besser als andere ?")).

Wieso wurde ein Thread daraus gemacht: weil es in der Dokumentation so drin steht.
Applet ist ruckelig: bei mir ruckelt es nicht.

Dann wirst du dich bestimmt bald an dein nächstes Spiel heranwagen.
Wenn du noch nach einer Spielidee suchst: auf meiner Homepage unter "Anregungen" stehen ungefähr 40 Applets und Flashplayer-Animationen von einfachen Videospielen (viele aus den 80ern). Kannst dir ja eines von aussuchen :rtfm:- du kannst natürlich auch selber im Internet suchen:pueh:.
 
Zuletzt bearbeitet:

Pikkolini

Mitglied
Danke, Oliver :)
Aber ich hab das Applet auch nur mit diesem Forum hier hinbekommen ;)
Wegen der unvollständigkeit, ich hab ja auch am Anfang geschrieben, dass es noch unvollständig ist und das mit der Highscore wollte ich auch noch machen. Allerdings muss ich mir noch überlegen, wie ich die Highscore aus der Textdatei auf den Bildschirm bringe.
Und wegen dem ruckeln, ich habe es gerade mal auf einem älteren Computer ausprobiert, und da ruckelt es auch nicht. Es scheint wohl, dass es an meinem Computer liegt.
 

L-ectron-X

Gesperrter Benutzer
Ich habe mir das Applet mal herunter geladen, aber noch nicht zerlegt.
Unter Ubuntu läuft es weder im Firefox noch im Opera. Es wird jeweils nur das vermutlich erste Bild angezeigt. Die Anzeige steht also.
 

OliverKroll

Aktives Mitglied
Den Highscore kann man so schreiben und lesen:
Java:
import java.io.*;

public class Hauptprogramm
{
	public static void main(String[] args)
	{
		int i;
		String s;
		int z;
		int zahl;
		boolean zuende;
	        FileOutputStream datei1;
	        FileInputStream datei2;
		
		try
		{
			System.out.println("Ausgabe in Datei");
			
			datei1=new FileOutputStream("src/pack1/Punkte.txt");
			
			for(i=1;i<=10;i++)
			{
				zahl=i*i;
				datei1.write((""+zahl+"\n").getBytes());
				System.out.println(i+": "+zahl);
			}
			
			datei1.close();
			
			
			// -------------
			
			System.out.println("Eingabe aus Datei");
			datei2=new FileInputStream("src/pack1/Punkte.txt");
			
			for(i=1;i<=10;i++)
			{
				s="";
				zuende=false;
				while(!zuende)
				{
					z=datei2.read();
					if(z==10 || z==-1)
					{
						zuende=true;
					}
					else
					{
						s+=(char)z;
					}
				}
				zahl=Integer.parseInt(s);
				System.out.println(zahl);
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
}
:smoke:
 

Pikkolini

Mitglied
Ich habe mir das Applet mal herunter geladen, aber noch nicht zerlegt.
Unter Ubuntu läuft es weder im Firefox noch im Opera. Es wird jeweils nur das vermutlich erste Bild angezeigt. Die Anzeige steht also.

???:L Ich dachte immer Java wäre plattformunabhängig.

Und danke Oliver, aber meine Überlegung bezog sich eher darauf wie ich die Highscore aufs Applet bekomme. Aber das schaff ich schon alleine :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Applet Java Applet läuft im Browser nicht mehr (HTTPClient - NoClassDefFoundError) Tools - Maven, Gradle, Ant & mehr 3
H Applet läuft nicht im Browser Tools - Maven, Gradle, Ant & mehr 3
Q Applet Applet läuft nicht im Browser Tools - Maven, Gradle, Ant & mehr 14
sliwalker Trotz FAQ, Forum und Google läuft Applet im Firefox nicht Tools - Maven, Gradle, Ant & mehr 6
G Applet läuft nicht auf Apache Server sonst schon. Tools - Maven, Gradle, Ant & mehr 4
G Applet läuft in Eclipse aber im Browser nicht Tools - Maven, Gradle, Ant & mehr 12
G Applet läuft nur im IE nicht Tools - Maven, Gradle, Ant & mehr 3
H Applet läuft unter Windows 98 nicht! Tools - Maven, Gradle, Ant & mehr 6
W Applet läuft im JBuilder - Vorschaufenster aber im IE nicht Tools - Maven, Gradle, Ant & mehr 9
A Java Applet läuft nicht, wenn via IIS geladen Tools - Maven, Gradle, Ant & mehr 2
L Applet läuft 'nur' auf der JVM Tools - Maven, Gradle, Ant & mehr 5
G Applet läuft erst, nach dem ich es abgeschrieben hatte Tools - Maven, Gradle, Ant & mehr 8
B Applet: com.sun.deploy.security.BlockedException :-( Tools - Maven, Gradle, Ant & mehr 0
M Applet Applet legt Browser lahm Tools - Maven, Gradle, Ant & mehr 3
J Applet Aus anderer Browserinstanz Applet abfragen Tools - Maven, Gradle, Ant & mehr 2
P Linux Applet/Webstart Schriftunterschiede Tools - Maven, Gradle, Ant & mehr 3
E JMol -Applet Einbindung Tools - Maven, Gradle, Ant & mehr 0
T Applet Applet und IText wirft Incompatible magic value 1008813135 Fehler Tools - Maven, Gradle, Ant & mehr 6
P Applet Applet Signatur auf Server mit SSL-Zertifikat? Tools - Maven, Gradle, Ant & mehr 7
H Applet Applet wird nicht angezeigt Tools - Maven, Gradle, Ant & mehr 2
M Applet Applet funktioniert in Google Chrome nicht Tools - Maven, Gradle, Ant & mehr 2
O Applet "Anwendung kann nicht ausgeführt werden" Tools - Maven, Gradle, Ant & mehr 6
Q Applet Fehlermeldung bei Applet-Wechsel Tools - Maven, Gradle, Ant & mehr 4
T Daten per POST-Methode aus Java-Applet nach php-Script senden Tools - Maven, Gradle, Ant & mehr 3
R Applet friert Adresszeile des Firefox ein Tools - Maven, Gradle, Ant & mehr 2
K Applet als Jar-Datei in HTML einbinden Tools - Maven, Gradle, Ant & mehr 14
H Applet-Fehlermeldung Tools - Maven, Gradle, Ant & mehr 10
J Applet URL mittels TTS als Applet lesen lassen Tools - Maven, Gradle, Ant & mehr 40
F Applet verwischt, wenn Seite gescrollt wird Tools - Maven, Gradle, Ant & mehr 16
S Applet Applet mit C# öffnen: java.lang.SecurityException: Permission denied (WinXP) Tools - Maven, Gradle, Ant & mehr 8
J Applet-Quellcode einsehen Tools - Maven, Gradle, Ant & mehr 6
E Applet Applet und Datenbank Konzept Tools - Maven, Gradle, Ant & mehr 4
A Applet: Html Datei und Class Datei nicht im selben Verzeichnis Tools - Maven, Gradle, Ant & mehr 2
S Applet soll Textdatei von fremdem Server öffnen Tools - Maven, Gradle, Ant & mehr 8
E Java Applet bearbeiten Tools - Maven, Gradle, Ant & mehr 8
Quasar Wie signiere ich mein Applet richtig? Tools - Maven, Gradle, Ant & mehr 6
M mit Applet Javascript Aufrufen Tools - Maven, Gradle, Ant & mehr 2
S Applet and stop() method und gui blocked Tools - Maven, Gradle, Ant & mehr 4
A Applet Applet startet nach Einbinden auf Website nicht Tools - Maven, Gradle, Ant & mehr 4
A Applet, xxx.jar und hsqldb Tools - Maven, Gradle, Ant & mehr 4
T Webstart oder Applet Tools - Maven, Gradle, Ant & mehr 2
H Applet applet neu laden im browser Tools - Maven, Gradle, Ant & mehr 10
M Applet neustart Tools - Maven, Gradle, Ant & mehr 5
S Applet request unter Linux Tools - Maven, Gradle, Ant & mehr 14
S Applet GUI nicht im Webbrowser sichtbar Tools - Maven, Gradle, Ant & mehr 5
S Mittel Applet Datei an ein Webserver übertragen Tools - Maven, Gradle, Ant & mehr 2
M Applet in ClientServer J2EE Anwendung debugen Tools - Maven, Gradle, Ant & mehr 6
H Java Applet Problem beim einbinden in HTML Tools - Maven, Gradle, Ant & mehr 3
M Java3D Applet flackert wenn ein Button(HTML) gedrückt wird Tools - Maven, Gradle, Ant & mehr 11
S Policy mit Signiertem Applet verteilen Tools - Maven, Gradle, Ant & mehr 9
F Applet findet include nicht Tools - Maven, Gradle, Ant & mehr 15
L PHP + Java Applet Kommunikation Tools - Maven, Gradle, Ant & mehr 9
C Probleme mit Applet mit SQL im Browser Tools - Maven, Gradle, Ant & mehr 4
G Java-Applet Probleme beim Browser Tools - Maven, Gradle, Ant & mehr 14
G Textfile in Applet laden möglich? Tools - Maven, Gradle, Ant & mehr 2
A Java-Applet Sandbox deaktiviren? Tools - Maven, Gradle, Ant & mehr 2
B Java-Applet geht nicht (auf dem Webserver) Tools - Maven, Gradle, Ant & mehr 9
V JAR-Datei eines (J)Applet funktioniert nicht - Help! Tools - Maven, Gradle, Ant & mehr 19
S Java Applet per Klick starten? Tools - Maven, Gradle, Ant & mehr 6
S Applet geht nicht Tools - Maven, Gradle, Ant & mehr 25
J Applet signieren Tools - Maven, Gradle, Ant & mehr 2
H Applet - Geschicklichkeitsspiel programmieren Tools - Maven, Gradle, Ant & mehr 16
U Jar funktioniert nicht als Applet Tools - Maven, Gradle, Ant & mehr 3
C Applet Frage Tools - Maven, Gradle, Ant & mehr 4
M Java Applet - enforce use of older JRE Tools - Maven, Gradle, Ant & mehr 3
N Wie Java-Programm zu Applet machen?! Tools - Maven, Gradle, Ant & mehr 2
W Webseite aus Applet öffnen Tools - Maven, Gradle, Ant & mehr 3
lumo Applet - resize Tools - Maven, Gradle, Ant & mehr 7
Icewind Applet reagiert nach neu laden der Webseite nicht mehr verlässlich auf KeyEvents Tools - Maven, Gradle, Ant & mehr 6
R Applet mit MySQL Tools - Maven, Gradle, Ant & mehr 3
A jar datei trotz zertifikat nich aus applet ausführbar Tools - Maven, Gradle, Ant & mehr 4
F Fehlende Applet Rechte Tools - Maven, Gradle, Ant & mehr 12
N [Applet] Button wir nach 5 secs Unsichtbar Tools - Maven, Gradle, Ant & mehr 2
N jar -> applet wie setzt man das am leichtesten um Tools - Maven, Gradle, Ant & mehr 7
V applet Java 1.6 -> 1.5 Problem ... wie mit Ant zu lösen? Tools - Maven, Gradle, Ant & mehr 7
F applet als JAR -> AccessControlException Tools - Maven, Gradle, Ant & mehr 3
grudge File in Applet laden Tools - Maven, Gradle, Ant & mehr 4
E Java Applet - Double Buffering Problem (Flackern) Tools - Maven, Gradle, Ant & mehr 6
R Applet mit bestimmter JRE ausführen Tools - Maven, Gradle, Ant & mehr 9
traysa Wie binde ich ein applet in eine jsp Tools - Maven, Gradle, Ant & mehr 3
D Mit dem Applet das DOM manipulieren? Tools - Maven, Gradle, Ant & mehr 3
ABstraCT Applet getCodeBase() Zugriff auf darüberliegendenden Ordner ? Tools - Maven, Gradle, Ant & mehr 1
S Java-Applet Steuerung IO Karte am Drucker-Port Tools - Maven, Gradle, Ant & mehr 4
P URL aus Applet öffnen? Tools - Maven, Gradle, Ant & mehr 7
ABstraCT Mit Applet in ne Datei auf seinem Server schreiben. Tools - Maven, Gradle, Ant & mehr 10
E Verzögerung beim Refresh (F5) mit einem Applet verursachen Tools - Maven, Gradle, Ant & mehr 16
deetee Applet Frage Tools - Maven, Gradle, Ant & mehr 2
S Fehler in einem Upload - Applet (nicht gelöst!!) Tools - Maven, Gradle, Ant & mehr 2
G Variable an zweites Applet übergeben Tools - Maven, Gradle, Ant & mehr 3
M Dringend: Sehr kompliziertes Applet Problem Tools - Maven, Gradle, Ant & mehr 4
O Javascript kommuniziert mit Applet? Tools - Maven, Gradle, Ant & mehr 2
H Spracherkennung mit Applet / Policy bzw. Security Fehler Tools - Maven, Gradle, Ant & mehr 2
zilti Nerviger Hinweis bei Applet- und WS-Fenstern - wieso? Tools - Maven, Gradle, Ant & mehr 3
S Datei-/Verzeichniszugriff von signiertem Applet Tools - Maven, Gradle, Ant & mehr 6
G Signiertes Applet installieren? Tools - Maven, Gradle, Ant & mehr 3
G Applet mit Parameter aus JavaScript Tools - Maven, Gradle, Ant & mehr 5
A Applet Maus Koordinaten ohne MouseMotionListener Tools - Maven, Gradle, Ant & mehr 3
K Applet in Eclipse funktioniert, im Browser nicht Tools - Maven, Gradle, Ant & mehr 7
T Applet soll Java Programm starten Tools - Maven, Gradle, Ant & mehr 2
S Applet pai.nt? Tools - Maven, Gradle, Ant & mehr 3

Ähnliche Java Themen

Neue Themen


Oben