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
-
Maak één belangrijke luisteraarsklasse als
class MyListener implements KeyListener{ // override all the methods of KeyListener interface. }
-
Nu is onze klas
MyKeyListener
klaar om naar de belangrijkste gebeurtenissen te luisteren. Maar het kan dit niet rechtstreeks doen. -
Maak een willekeurig object zoals een
JFrame
-object waardoorMyListener
de belangrijkste gebeurtenissen kan beluisteren. daarvoor moet je hetMyListener
-object toevoegen aan hetJFrame
-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.