Klasse Keyboard funktioniert in Applet nicht

Hallo,
ich habe versucht ein Tutorial (von Brotcrunsher) in ein Applet zu packen. Die Klasse Keyboard funktioniert dabei in Eclipse ohne Probleme, aber im Applet will sie überhaupt nicht reagieren.
Im Grunde wird ja in der while Schleife die Update Methode des Players aufgerufen und dort soll ja auf die Eingabe mittels der Keyboard Klasse reagiert werden, es passiert aber nichts.
Kann mir jemand sagen, warum das so ist?

Die “Haupt”-Klasse


import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;



public class AppletTest extends Applet implements Runnable, KeyListener {

    Thread thread;

    int width, height;
    boolean pause = false;
    String text = "TEST";
    boolean running = true;
    
    //static SoundLib soundlib = new SoundLib();

    long lastFrame = System.currentTimeMillis();

    public Background img;
    public Player player;
    
    // Variablen für die Doppelpufferung
    private Image dbImage;
    private Graphics dbg;

    public void init() {
        setSize(800, 600);
        width = getSize().width;
        height = getSize().height;
        img = new Background(50, "weltraum.png");
        player = new Player(50,50, "raumschiffchen.png");

        addKeyListener(this);
        
/*        soundlib.loadSound("boom", "resources/boom.wav");
        soundlib.loadSound("shot", "resources/shot.wav");
        soundlib.loadSound("soundtrack", "resources/soundtrack.wav");
        soundlib.loopSound("soundtrack");
        */

        thread = new Thread(this);
        thread.start();
    }

    public void paint(Graphics g) {

        g.drawImage(img.getLook(), img.getX(), 0, this);
        g.drawImage(player.getLook(), 50, 50, this);

        g.setColor(Color.red);
        g.drawString(text, 20, 20);

        getToolkit().sync();
        
        

    }

    @Override
    public void keyPressed(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyTyped(KeyEvent e) {
        char c = e.getKeyChar();
        text = text + c;
        
    }
    

    @Override
    public void run() {

        while (true) {
            
            
            
            long thisFrame = System.currentTimeMillis();
            float timeSinceLastFrame = ((float) (thisFrame - lastFrame)) / 1000f;
            lastFrame = thisFrame;

            img.update(timeSinceLastFrame);
            player.update(timeSinceLastFrame);
            
            getToolkit().sync();
            repaint();
            
            try {
                thread.sleep(15);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
    
    /** Update - Methode, Realisierung der Doppelpufferung zur Reduzierung des Bildschirmflackerns */
    public void update (Graphics g)
    {
        // Initialisierung des DoubleBuffers
        if (dbImage == null)
        {
            dbImage = createImage (this.getSize().width, this.getSize().height);
            dbg = dbImage.getGraphics ();
        }

        // Bildschirm im Hintergrund löschen
        dbg.setColor (getBackground ());
        dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);

        // Auf gelöschten Hintergrund Vordergrund zeichnen
        dbg.setColor (getForeground());
        paint (dbg);

        // Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm anzeigen
        g.drawImage (dbImage, 0, 0, this);
    }
}```Die Player Klasse
```package de.fts.applets;

import java.awt.Image;
import java.awt.event.KeyEvent;
import java.net.URL;

import javax.swing.ImageIcon;

public class Player {

    private float posx, posy;

    private Image look;

    public Player(int x, int y, String name) {
        this.posx = x;
        this.posy = y;

        look = getImage(name);
    }

    private Image getImage(String name) {
        URL imgURL = getClass().getClassLoader().getResource("resources/" + name);
        ImageIcon icon = new ImageIcon(imgURL);
        return icon.getImage();
    }
    
    public Image getLook(){
        return look;
    }
    
    public void update(float timeSinceLastFrame) {
        if(Keyboard.isKeyDown(KeyEvent.VK_W))posy-=300*timeSinceLastFrame;
        
    }
}
```Und die Keyboard Klasse

```package de.fts.applets;

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

public class Keyboard implements KeyListener {
    private static boolean[] keys = new boolean[1024]; 
    
    public static boolean isKeyDown(int keyCode) {
        if (keyCode>=0&&keyCode<keys.length) return keys[keyCode];
        else return false;
    }
    
    @Override
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if(keyCode>=0&&keyCode<keys.length) keys[keyCode]=true;
        
    }

    @Override
    public void keyReleased(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if(keyCode>=0&&keyCode<keys.length) keys[keyCode]=false;
        
    }

    
    //unnötig
    @Override
    public void keyTyped(KeyEvent arg0) {
        // TODO Auto-generated method stub
        
    }
    
}
```(Die Background hatte ich mal weggelassen, ist ja nicht von Belang)

Ohne es getestet oder im Detail nachvollzogen zu haben: Sowas ist “oft” eine Focus-Sache. Klick’ nach dem Start einmal mit der Maus in den Applet-Bereich, und schau (ggf. auch mit ein paar System.out.printlns) ob der KeyListener danach reagiert. Falls ja, kann man da was mit requestFocusInWindow o.ä. machen.
Unabhängig davon könntest du in Betracht ziehen, ein JApplet zu verwenden, bzw. allgemein Swing statt AWT. Da sind Sachen wie das Double-Buffering schon eingebaut.

Um eine Lösung bei Problemen mit der Ausführung von Applets zu finden, ist es wichtig, die Ausgabe der Java-Konsole zu analysieren. Wenn ein Applet nicht startet, gibt die Konsole meist Fehlermeldungen aus, die Aufschluss über die Art des Fehlers geben.

Mehr auch hier: Warum verweigert mein Browser die Anzeige von Java-Applets?

Hallo,

also das Applet funktioniert. Das mit dem Fokus war mir schon bekannt.
Es ist ja auch so, dass ich in der Hauptklasse ebenfalls ein Keylistener zu Testzwecken habe und dieser funktioniert (und ja, ich hab den auch schon entfernt und ohne Keylistener in der Hauptklasse versucht)

Ich kann halt das Raumschiff(Klasse Player) nicht bewegen. Die Klasse Keyboard reagiert irgendwie gar nicht. Auch wenn ich versuche die in die Schleife im Thread einzubinden.

Beim zweiten Drüberschauen scheint es, als würde nirgendwo eine Instanz von ‘Keyboard’ erstellt und als KeyListener irgendwo hinzugefügt…

[QUOTE=Marco13]Beim zweiten Drüberschauen scheint es, als würde nirgendwo eine Instanz von ‘Keyboard’ erstellt und als KeyListener irgendwo hinzugefügt…[/QUOTE]Genau… stattdessen implementiert dein Applet selbst einen KeyListener und added sich auch selbst. Da wo es heisst “addKeyListener(this)” sollte eigentlich “addKeyListener(myKeyboardInstance)” stehen.

aha, also so was wie
Keyboard keyboard = new Keyboard();

und dann
addKeyListener(keyboard);

Das werde ich gleich mal probieren, allerdings war es ja im “nicht”-Applet Programm ja nicht mal nötig, den Keylistener zu “adden”

Hast du in der anderen Version anstatt von Applet vielleicht von Keyboard geerbt?

Gruß

Nee, hab ich nicht, die Klasse liegt nur im gleichen Package
aber so wie ich vorhin geschrieben habe funktioniert es :slight_smile:

Vielen Dank!