現在、プログラムにキーリスナーを実装して、矢印キーを押したときにアクションが実行されるようにしています。プログラム内のオブジェクトは左または右に移動します。
これが私のプログラムの移動方法です
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();
}
(KeyEvent)eでプログラムがどのように読み取られることになっているのかと思います。矢印キーを実際に入力することはできません。
助けてください!
編集:コードに何を追加する必要があるかを知る必要もあります。これにより、プログラムは、キー入力を約700ミリ秒待ってから別のメソッドに移ります。
http://docs.Oracle.com/javase/tutorial/uiswing/events/keylistener.html このチュートリアルを確認
それがUIベースのアプリケーションの場合、「コードに何を追加する必要があるかを知っておく必要があります。これにより、プログラムがキー入力を約700ミリ秒待ってから、別のメソッドに移ります」GlassPaneまたはTimerクラスを使用して、要件。
主なイベント:
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;
}
}
このゲームの例を確認してください http://zetcode.com/tutorials/javagamestutorial/movingsprites/
これが [〜#〜] 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");
}
}
さらにこれらのリンクをお読みください: キーリスナーの作成方法 および キーバインディングの使用方法
KeyListener
インターフェースを実装するクラスは、カスタムキーイベントリスナーになります。このリスナーは、キーイベントを直接リッスンできません。 JFrame
などの中間オブジェクトを介してのみキーイベントをリッスンできます。そう
1つのKeyリスナークラスを
class MyListener implements KeyListener{
// override all the methods of KeyListener interface.
}
これで、クラスMyKeyListener
がキーイベントをリッスンする準備ができました。しかし、直接そうすることはできません。
JFrame
オブジェクトのような任意のオブジェクトを作成し、それを介してMyListener
はキーイベントをリッスンできます。そのためには、MyListener
オブジェクトをJFrame
オブジェクトに追加する必要があります。
JFrame f=new JFrame();
f.addKeyListener(new MyKeyListener);
KeyListenerを使用することに加えて(他の回答で示されているように)、使用しているJComponentがFocusableであることを確認する必要がある場合があります。これをコンポーネントに追加することで設定できます(サブクラス化している場合):
@Override
public void setFocusable(boolean b) {
super.setFocusable(b);
}
そして、これをコンストラクタに追加することにより:
setFocusable(true);
または、親クラス/コンテナーから関数を呼び出す場合:
JComponent childComponent = new JComponent();
childComponent.setFocusable(true);
そして、他の人が言及したすべてのKeyListenerを実行します。