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
Votre
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
Vous devez vous connecter pour publier un commentaire.
Je parie que vous demandez la mise au point avant le Composite a été rendue (avant la fenêtre de premier niveau a eu
pack()
ousetVisible(true)
appelé), et si oui, cela ne fonctionne pas. L'accent requête ne sera éventuellement accordé après composants ont été rendus. Avez-vous vérifié que votre appel àrequestFocus()
est de retour? Il doit retourner true pour votre appel pour avoir quelque chance de succès. Aussi, il est préférable d'utiliserrequestFocusInWindow()
plutôt querequestFocus()
.Mais plus important encore, vous ne devriez pas être à l'aide de KeyListeners pour cela, mais plutôt de touches, un niveau plus élevé concept qui Swing utilise elle-même pour répondre à la pression des touches.
Modifier
Un exemple d'une SSCCE:
Edit 2
Et l'équivalent SSCCE à l'aide de raccourcis clavier:
Modifier 3
Concernant votre récent SSCCE, votre
while (true)
boucles sont le blocage de votre Swing événement de fil et peut empêcher l'interaction de l'utilisateur ou de la peinture de passe. Mieux vaut utiliser un Swing Timer plutôt quewhile (true)
. Par exemple:encore une fois, avez-vous vérifié avec votre
requestFocus()
appel de la méthode est de retour? Est-il retourner vrai ou faux?il est de retour faux tout le temps
c'est effectivement ce que j'ai mentionné dans ma question, bien que je demande, il semble qu'il n'est pas ciblé , ce qui signifie qu'il renvoie false et je ne sais pas comment le faire retourner la valeur true.
mon point exactement. Ensuite, vous n'avez aucun espoir de succès que si vous changer quelque chose. Mieux si vous pouviez créer et de poster un petit compilable et exécutable du programme que l'on peut courir et qui témoigne de votre problème afin que nous puissions voir par nous-mêmes, un sscce.
OriginalL'auteur Hovercraft Full Of Eels
Il est possible d'utiliser l'ONGLET" bouton pour basculer entre les boutons et la clé de l'auditeur.
J'ai un programme avec un seul bouton qu'après je le presse, l'écouteur ne fonctionne pas.
J'ai réalisé que si vous appuyez sur la touche "TAB", "Attention" ou "focus" du programme retourne à l'écouteur.
peut-être que cela aidera à: http://docstore.mik.ua/orelly/java-ent/jfc/ch03_08.htm
OriginalL'auteur user3500777