java keylistener pas appelé

J'ai écrit un exemple de code utilisant KeyListener en Java,
J'ai créé un JPanel, puis définissez ses focusable pour vrai, j'ai créé un KeyListener, a demandé une mise au point et ajouté le KeyListener à mon jury. Mais les méthodes pour le keyListener ne sont jamais appelés. Il semble bien que j'ai demandé, il n'a pas le focus.

Peut aider quelqu'un?

listener = new KeyLis();
this.setFocusable(true);
this.requestFocus();
this.addKeyListener(listener);

 class KeyLis implements KeyListener{

    @Override
    public void keyPressed(KeyEvent e) {
        currentver += 5;
         switch (e.getKeyCode()) {
            case KeyEvent.VK_LEFT : if(horizontalyInBounds()) currentPos-= 5;  
                 break;
            case KeyEvent.VK_RIGHT: if(horizontalyInBounds()) currentPos+= 5;  
                 break;
        }
        repaint();
    }

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

    }

    @Override
    public void keyTyped(KeyEvent e) {
    }
}

Si un exécutable, le code ne devrait être nécessaire:

  import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class test extends JFrame {
private AreaOfGame areaOfGame;
public test()
{
super("");
setVisible(true);
this.setBackground(Color.darkGray);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
setLayout(null);
setBounds(200, 10, 400, 700);
areaOfGame = new AreaOfGame();
this.add(areaOfGame);
startGame();
}
public int generateNext()
{
Random r = new Random();
int n = r.nextInt(7);
return n;
}
public void startGame()
{
while(!areaOfGame.GameOver())
{
areaOfGame.startGame(generateNext());
}
}
public static void main(String[] args) {
new MainFrame();
}
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JPanel;
public class AreaOfGame extends JPanel {
private static final int rightside = 370;
private int bottom;
private int top;
private int currentPos;
private int currentver;
private KeyLis listener;
public AreaOfGame()
{
super();
bottom = 650;
top = 50;
setLayout(null);
setBounds(20, 50, 350, 600);
setVisible(true);
this.setBackground(Color.lightGray);
listener = new KeyLis();
this.setFocusable(true);
if(this.requestFocus(true))
System.out.println("true");;
this.addKeyListener(listener);
currentPos = 150;
currentver=0;
}
public void startGame(int n)
{
while(verticallyInBound()){
System.out.println("anything");
}
}
public boolean verticallyInBound()
{
if(currentPos<= bottom -50)
return true;
return false;
}
public boolean GameOver()
{
if(top>= bottom){
System.out.println("game over");
return true;
}
else return false;
}
public boolean horizontalyInBounds()
{
if(currentPos<=rightside && currentPos>= 20)
return true;
else return false;
}
class KeyLis implements KeyListener{
@Override
public void keyPressed(KeyEvent e) {
System.out.println("called");
currentver += 5;
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT : if(horizontalyInBounds()) currentPos-= 5;  break;
case KeyEvent.VK_RIGHT: if(horizontalyInBounds()) currentPos+= 5;  break;
}
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
//TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
System.out.println("called 3");
}
}
}
Il serait utile si vous pouviez nous donner votre "KeyLis" de la classe, peut-être que le problème est là.
merci, j'ai ajouté l'auditeur classe
Hmmm... je pense que j'ai eu un problème similaire, à un moment donné. Essayez d'appeler la méthode "e.consommer()" à la fin de votre keyPressed(KeyEvent e) de la méthode. Laissez-moi savoir si cela fonctionne.
essayez d'ajouter un System.out.println("something unique") pour chaque méthode de votre auditeur. Cela permettra de s'assurer qu'ils ne sont pas appelés.
Votre while (true) boucles de verrouillage de votre événement de fil.

OriginalL'auteur BBB | 2011-12-12