it-swarm.com.de

So verwenden Sie KeyListener

Ich versuche gerade, einen Keylistener in meinem Programm zu implementieren, damit eine Aktion ausgeführt wird, wenn ich eine Pfeiltaste drücke. Das Objekt in meinem Programm wird entweder nach links oder nach rechts verschoben.

Hier ist die Bewegungsmethode in meinem Programm

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();
    }

Ich frage mich, wie das Programm lesen soll (KeyEvent). E. Ich kann nicht wirklich eine Pfeiltaste eingeben ....

Bitte helfen 

edit: Ich muss auch wissen, was ich meinem Code hinzufügen muss, damit mein Programm etwa 700 Millisekunden auf einen Tasteneingang wartet, bevor es zu einer anderen Methode wechselt

3
DSdavidDS

http://docs.Oracle.com/javase/tutorial/uiswing/events/keylistener.html Überprüfen Sie dieses Tutorial

Wenn es sich um eine UI-basierte Anwendung handelt, "muss ich auch wissen, was ich meinem Code hinzufügen muss, damit mein Programm etwa 700 Millisekunden auf einen Tasteneingang wartet, bevor es zu einer anderen Methode übergeht". Sie können die GlassPane- oder Timer-Klasse verwenden, um die Anforderung.

Für das Schlüsselereignis:

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;
    }
}

Überprüfen Sie dieses Spielbeispiel http://zetcode.com/tutorials/javagamestutorial/movingsprites/

10

Hier ist ein 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");
    }
}

Lesen Sie dazu auch folgende Links: So schreiben Sie einen Key Listener und So verwenden Sie Tastenkombinationen

6
COD3BOY

Die Klasse, die die Schnittstelle KeyListener implementiert, wird zu unserem Listener für benutzerdefinierte Ereignisereignisse. Dieser Listener kann die Schlüsselereignisse nicht direkt anhören. Er kann die Schlüsselereignisse nur über Zwischenobjekte wie JFrame abhören. So 

  1. Erstellen Sie eine Key-Listener-Klasse als

    class MyListener implements KeyListener{
    
       // override all the methods of KeyListener interface.
    }
    
  2. Jetzt ist unsere Klasse MyKeyListener bereit, die wichtigsten Ereignisse zu hören. Kann es aber nicht direkt tun.

  3. Erstellen Sie ein beliebiges Objekt wie JFrame, durch das MyListener die Schlüsselereignisse abhören kann. Dazu müssen Sie dem MyListener-Objekt ein JFrame-Objekt hinzufügen.

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

Neben der Verwendung von KeyListener (wie die Antworten anderer zeigen), müssen Sie manchmal sicherstellen, dass die verwendete JComponent fokussierbar ist. Dies kann festgelegt werden, indem Sie dies zu Ihrer Komponente hinzufügen (wenn Sie Unterklassen verwenden):

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

Und indem Sie dies Ihrem Konstruktor hinzufügen:

setFocusable(true);

Oder, wenn Sie die Funktion von einer übergeordneten Klasse/einem übergeordneten Container aus aufrufen:

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

Und dann alle KeyListener-Sachen, die von anderen erwähnt wurden.

1
Astrolamb