KeyListener gebruiken

Ik probeer momenteel een keylistener in mijn programma te implementeren, zodat het een actie uitvoert wanneer ik op een pijltoets druk, het object in mijn programma beweegt naar links of naar rechts.

Hier is de verplaatsingsmethode in mijn programma

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

Ik vraag me af hoe het programma (KeyEvent) e moet inlezen. Ik kan niet echt een pijltoets typen….

Help alstublieft!

edit: ik moet ook weten wat ik aan mijn code moet toevoegen, zodat mijn programma ongeveer 700 milliseconden wacht op een toetsinvoer voordat ik verder ga met een andere methode


Antwoord 1, autoriteit 100%

http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener .html
Bekijk deze tutorial

Als het een op de gebruikersinterface gebaseerde toepassing is, “Ik moet ook weten wat ik aan mijn code moet toevoegen, zodat mijn programma ongeveer 700 milliseconden wacht op een toetsinvoer voordat ik verder ga met een andere methode”, kun je de GlassPane- of Timer-klasse gebruiken om aan de eis te voldoen.

Voor belangrijke gebeurtenis:

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

bekijk dit spelvoorbeeld http://zetcode.com/tutorials/javagamestutorial/movingsprites/


Antwoord 2, autoriteit 73%

Hier is een 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");
    }
}

Lees ook deze links: Hoe schrijf je een belangrijke luisteraaren Toetsbindingen gebruiken


Antwoord 3, autoriteit 18%

De klasse die de KeyListener-interface implementeert, wordt onze custom key event listener. Deze luisteraar kan niet direct naar de belangrijkste gebeurtenissen luisteren. Het kan alleen de belangrijkste gebeurtenissen beluisteren via tussenliggende objecten zoals JFrame. Dus

  1. Maak één belangrijke luisteraarsklasse als

    class MyListener implements KeyListener{
       // override all the methods of KeyListener interface.
    }
    
  2. Nu is onze klas MyKeyListenerklaar om naar de belangrijkste gebeurtenissen te luisteren. Maar het kan dit niet rechtstreeks doen.

  3. Maak een willekeurig object zoals een JFrame-object waardoor MyListenerde belangrijkste gebeurtenissen kan beluisteren. daarvoor moet je het MyListener-object toevoegen aan het JFrame-object.

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

Antwoord 4, autoriteit 9%

Naast het gebruik van KeyListener (zoals blijkt uit de antwoorden van anderen), moet u er soms voor zorgen dat de JComponent die u gebruikt Focusable is. Dit kan worden ingesteld door dit toe te voegen aan uw component (als u subclasseert):

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

En door dit toe te voegen aan uw constructor:

setFocusable(true);

Of, als u de functie aanroept vanuit een bovenliggende klasse/container:

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

En dan alle door anderen genoemde KeyListener-dingen doen.

Other episodes