Comment utiliser les raccourcis clavier au lieu des auditeurs de clés

Je suis en utilisant KeyListeners dans mon code (jeu ou autre) en tant que moyen pour mon sur les objets à l'écran à réagir à l'utilisateur la saisie de la clé. Voici mon code:

public class MyGame extends JFrame {
static int up = KeyEvent.VK_UP;
static int right = KeyEvent.VK_RIGHT;
static int down = KeyEvent.VK_DOWN;
static int left = KeyEvent.VK_LEFT;
static int fire = KeyEvent.VK_Q;
public MyGame() {
//     Do all the layout management and what not...
JLabel obj1 = new JLabel();
JLabel obj2 = new JLabel();
obj1.addKeyListener(new MyKeyListener());
obj2.addKeyListener(new MyKeyListener());
add(obj1);
add(obj2);
//     Do other GUI things...
}
static void move(int direction, Object source) {
//do something
}
static void fire(Object source) {
//do something
}
static void rebindKey(int newKey, String oldKey) {
//     Depends on your GUI implementation.
//     Detecting the new key by a KeyListener is the way to go this time.
if (oldKey.equals("up"))
up = newKey;
if (oldKey.equals("down"))
down = newKey;
//     ...
}
public static void main(String[] args) {
new MyGame();
}
private static class MyKeyListener extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
Object source = e.getSource();
int action = e.getExtendedKeyCode();
/* Will not work if you want to allow rebinding keys since case variables must be constants.
switch (action) {
case up:
move(1, source);
case right:
move(2, source);
case down:
move(3, source);
case left:
move(4, source);
case fire:
fire(source);
...
}
*/
if (action == up)
move(1, source);
else if (action == right)
move(2, source);
else if (action == down)
move(3, source);
else if (action == left)
move(4, source);
else if (action == fire)
fire(source);
}
}
}

J'ai des problèmes avec la réactivité:

  • J'ai besoin de cliquer sur l'objet pour qu'il fonctionne.
  • La réponse que je reçois pour en appuyant sur une des touches n'est pas la façon dont je voulais que ce travail - trop sensible ou trop instable.

Pourquoi cela se produit et comment puis-je résoudre ce problème?

source d'informationauteur user1803551