web-dev-qa-db-fra.com

Comment utiliser KeyListener

J'essaie actuellement d'implémenter un keylistener dans mon programme afin qu'il effectue une action lorsque j'appuie sur une touche fléchée; l'objet de mon programme se déplace vers la gauche ou vers la droite.

Voici la méthode de déplacement dans mon programme

public void moveDirection(KeyEvent e)
    {
        int move = 0;
        int r = K.getRow();
        int c = K.getCol();
        if (e.getKeyCode() == 39) move = 1; //KeyEvent.VK_RIGHT
        if (e.getKeyCode() == 37) move = 2; //KeyEvent.VK_LEFT
        //if (e.getKeyCode() == KeyEvent.VK_DOWN) move = 3;

        switch (move)
        {
            case 1: if (inBound(r, c+1))
                        K.setLocation(r ,c+1); 
                    if (inBound(r, c-1) && frame2[r][c-1] == K)
                        frame2[K.getRow()][K.getCol()-1] = null; 
                    break; //move right 39
            case 2: K.setLocation(K.getRow(), K.getCol()-1); break; //move left 37
            //case 3: b.setLocation(b.getRow()+1, b.getCol()); break; //move down
            default: return;
        }        
        processBlockList();
    }

Je me demande comment le programme est censé lire dans (KeyEvent) e. Je ne peux pas vraiment taper une flèche du clavier ....

S'il vous plaît aider! 

edit: J'ai également besoin de savoir ce que je dois ajouter à mon code pour que mon programme attend environ 700 millisecondes pour une entrée de clé avant de passer à une autre méthode.

3
DSdavidDS

http://docs.Oracle.com/javase/tutorial/uiswing/events/keylistener.html Consultez ce didacticiel

S'il s'agit d'une application basée sur l'interface utilisateur, "j'ai également besoin de savoir ce que je dois ajouter à mon code pour que mon programme attend environ 700 millisecondes pour une entrée de clé avant de passer à une autre méthode", vous pouvez utiliser la classe GlassPane ou Timer pour remplir la tâche. exigence.

Pour l'événement clé:

public void keyPressed(KeyEvent e) {

    int key = e.getKeyCode();

    if (key == KeyEvent.VK_LEFT) {
        dx = -1;
    }

    if (key == KeyEvent.VK_RIGHT) {
        dx = 1;
    }

    if (key == KeyEvent.VK_UP) {
        dy = -1;
    }

    if (key == KeyEvent.VK_DOWN) {
        dy = 1;
    }
}

vérifier cet exemple de jeu http://zetcode.com/tutorials/javagamestutorial/movingsprites/

10

Voici un SSCCE

package experiment;

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

public class KeyListenerTester extends JFrame implements KeyListener {

    JLabel label;

    public KeyListenerTester(String s) {
        super(s);
        JPanel p = new JPanel();
        label = new JLabel("Key Listener!");
        p.add(label);
        add(p);
        addKeyListener(this);
        setSize(200, 100);
        setVisible(true);

    }

    @Override
    public void keyTyped(KeyEvent e) {

        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            System.out.println("Right key typed");
        }
        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            System.out.println("Left key typed");
        }

    }

    @Override
    public void keyPressed(KeyEvent e) {

        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            System.out.println("Right key pressed");
        }
        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            System.out.println("Left key pressed");
        }

    }

    @Override
    public void keyReleased(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            System.out.println("Right key Released");
        }
        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            System.out.println("Left key Released");
        }
    }

    public static void main(String[] args) {
        new KeyListenerTester("Key Listener Tester");
    }
}

En outre, lisez ces liens: Comment écrire un auditeur de clé et Comment utiliser les raccourcis clavier

6
COD3BOY

La classe qui implémente l'interface KeyListener devient notre écouteur d'événements de clé personnalisé. Cet auditeur ne peut pas écouter directement les événements clés. Il peut uniquement écouter les événements clés via des objets intermédiaires tels que JFrame. Alors 

  1. Définir une classe d'écoute de clé comme

    class MyListener implements KeyListener{
    
       // override all the methods of KeyListener interface.
    }
    
  2. Notre classe MyKeyListener est maintenant prête à écouter les événements clés. Mais il ne peut pas le faire directement.

  3. Créez un objet tel que l'objet JFrame à travers lequel MyListener peut écouter les événements clés. pour cela, vous devez ajouter l'objet MyListener à l'objet JFrame.

    JFrame f=new JFrame();
    f.addKeyListener(new MyKeyListener);
    
2
Gyan

En plus d'utiliser KeyListener (comme le montrent les réponses des autres), vous devez parfois vous assurer que le composant JComponent que vous utilisez est Focusable. Ceci peut être défini en l'ajoutant à votre composant (si vous sous-classez):

@Override
public void setFocusable(boolean b) {
    super.setFocusable(b);
}

Et en ajoutant ceci à votre constructeur:

setFocusable(true);

Ou, si vous appelez la fonction depuis une classe/un conteneur parent:

JComponent childComponent = new JComponent();
childComponent.setFocusable(true);

Et ensuite, en faisant tout ce que KeyListener a mentionné.

1
Astrolamb