web-dev-qa-db-fra.com

addKeyListener () ne fonctionne pas pour JPanel

J'essaie de créer un moteur de jeu. J'ai fait la classe Game mais l'erreur réside dans la classe KeyBoard. Ici, je laisse du code.

Classe :: Jeu

package transfer2pc.co.cc.game.tileengine;

import Java.awt.Graphics;
import Java.util.HashMap;

import javax.swing.JPanel;

import transfer2pc.co.cc.game.tileengine.input.KeyBoard;

public abstract class Game extends JPanel implements Runnable {

   /**
    * 
    */
    private static final long serialVersionUID = 640206679500196209L;

    HashMap<String, ?> maps = null;

    KeyBoard keyBoard = null;

    public Game(){
        super();
        keyBoard = new KeyBoard(this);
        setKeyBoard(keyBoard);
        Thread th = new Thread(this);
        th.start();
    }

    public void run(){
        while(true){
            repaint();
            try {
                Thread.sleep(30);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void Paint(Graphics g){

    }

    public void addMap(){

    }

    public void setMap(){

    }

    public abstract void keyPressed(int code);

    public abstract void keyReleased(int code);

    public abstract void keyTyped(int code);

    public void setKeyBoard(KeyBoard key){
        addKeyListener(key);
    }

}

Classe :: KeyBoard

package transfer2pc.co.cc.game.tileengine.input;

import Java.awt.event.KeyAdapter;
import Java.awt.event.KeyEvent;
import Java.awt.event.KeyListener;

import transfer2pc.co.cc.game.tileengine.Game;

public class KeyBoard extends KeyAdapter implements KeyListener {

    Game game = null;

    public KeyBoard(Game gm){
        this.game = gm;
    }

    @Override
    public void keyPressed(KeyEvent e) {
        System.out.println("KeyPressed");
        game.keyPressed(e.getKeyCode());
    }

    @Override
    public void keyReleased(KeyEvent e) {
        game.keyReleased(e.getKeyCode());
    }

    @Override
    public void keyTyped(KeyEvent e) {
        game.keyTyped(e.getKeyCode());
    }

    public static char getChar(int key){
        return (char)key;
    }

}

Classe :: KeyTest

package transfer2pc.co.cc.game.tileengine.test;

import Java.awt.Graphics;

import javax.swing.JFrame;

import transfer2pc.co.cc.game.tileengine.Game;
import transfer2pc.co.cc.game.tileengine.input.KeyBoard;

public class KeyTest extends Game {

    /**
     * 
     */
    private static final long serialVersionUID = 8557676950779023327L;

    char pressed;

    public KeyTest(){
        super();
        addKeyListener(new KeyBoard(this));
    }

    @Override
    public void keyPressed(int code) {
        pressed = KeyBoard.getChar(code);
    }


    @Override
    public void keyReleased(int code) {

    }


    @Override
    public void keyTyped(int code) {

    }

    @Override
    public void Paint(Graphics g){
        g.drawString("You pressed: "+pressed, 20, 20);
    }

    public static void main(String[] args){
        JFrame frame = new JFrame("KeyTest");
        frame.setSize(640, 480);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.add(new KeyTest());
        frame.setVisible(true);
    }

}

Mais l'erreur était qu'il n'y avait aucune exception levée et l'entrée n'était pas lue. Quelqu'un pourrait-il me dire la bonne façon de faire cela ..

16

Simplement, votre panneau doit être focalisable. Ajoutez là où vous créez le panneau:

panel.setFocusable(true);
panel.requestFocusInWindow();

Voici un SSCCE (je suggère de poser des questions avec l'un d'eux à l'avenir):

import Java.awt.Dimension;
import Java.awt.event.KeyEvent;
import Java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class SimpleKeyTest {

    public static void main(String[] args) {

        Runnable r = new Runnable() {

            @Override
            public void run() {
                JFrame frame = new JFrame();
                JPanel panel = new JPanel();

                frame.getContentPane().add(panel);

                panel.addKeyListener(new KeyListener() {

                    @Override
                    public void keyTyped(KeyEvent e) {}

                    @Override
                    public void keyReleased(KeyEvent e) {}

                    @Override
                    public void keyPressed(KeyEvent e) {
                        System.out.println("Pressed " + e.getKeyChar());
                    }
                });

                panel.setFocusable(true);
                panel.requestFocusInWindow();

                frame.setSize(new Dimension(300, 300));
                frame.setVisible(true);
            }

        };

        SwingUtilities.invokeLater(r);

    }
}

En outre, https://www.google.com/search?q=jpanel+keylistener

42
jpalm

Vous pouvez ajouter l'écouteur de clés au JFrame, c'est quelque chose que j'ai fait dans le passé. Ce n'est probablement pas une bonne idée cependant si vous avez d'autres composants dans le JFrame.

2
MadcoreTom