addKeyListener() ne fonctionne pas pour un Composite
Je suis en train de faire un moteur de jeu. J'ai fait le Jeu de la classe, mais l'erreur réside dans le cours de Clavier. Ici, je laisse un peu de 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:: Clavier
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 a été il n'y a aucune exception n'est levée et l'entrée n'est pas en cours de lecture. Quelqu'un pourrait-il me dire la bonne façon de le faire..
1) Pour mieux aider plus tôt, après une SSCCE. 2) Un Composant doit être focusable avant de pouvoir écouter les événements clés. 3) Si un groupe contient des choses comme les arbres ou les tableaux, ces composants consomment les événements clés. 4) Il est généralement recommandé d'utiliser des raccourcis clavier sur une
KeyListener
. 5) Thread.sleep(30);
Ne pas le faire. J'ai discuté de cela 3 fois dans les 2 derniers jours. Recherche de mes messages et commentaires pour pourquoi.OriginalL'auteur Sri Harsha Chilakapati | 2011-12-14
Vous devez vous connecter pour publier un commentaire.
Simplement, votre groupe doit être focusable. Ajoutez-le partout où vous créez le panneau:
Voici un SSCCE (je suggère de poser des questions à l'un de ces dans le futur):
Aussi, https://www.google.com/search?q=jpanel+keylistener
OriginalL'auteur jpalm
Vous pouvez ajouter l'écouteur à la JFrame, c'est quelque chose que j'ai fait dans le passé.
Ce n'est probablement pas une bonne idée toutefois, si vous avez d'autres composants de la JFrame.
Je crois que vous pouvez ajouter à l'Applet/JApplet trop, mais je comprends pourquoi vous voulez garder le code dans le Composite
OriginalL'auteur MadcoreTom