5

現在、プログラムにキーリスナーを実装して、矢印キーを押したときにアクションを実行し、プログラム内のオブジェクトが左または右に移動するようにしようとしています。

これが私のプログラムの移動方法です

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 ミリ秒待機するように、コードに何を追加する必要があるかを知る必要もあります。

4

4 に答える 4

11

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/

于 2012-06-04T05:03:32.390 に答える
9

これが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");
    }
}

これらのリンクをさらに読んでください:キーリスナーを書く方法とキーバインディングを使用する方法

于 2012-06-04T05:28:23.760 に答える
2

インターフェイスを実装するクラスKeyListenerは、カスタム キー イベント リスナーになります。このリスナーは、キー イベントを直接リッスンすることはできません。などの中間オブジェクトを介してキー イベントのみをリッスンできますJFrame。そう

  1. 1つのキーリスナークラスを次のようにします

    class MyListener implements KeyListener{
    
       // override all the methods of KeyListener interface.
    }
    
  2. これで、クラスMyKeyListenerは主要なイベントをリッスンする準備が整いました。しかし、それを直接行うことはできません。

  3. キーイベントをリッスンできるオブジェクトのようなJFrameオブジェクトを作成します。そのためには、オブジェクトにオブジェクトMyListenerを追加する必要があります。MyListenerJFrame

    JFrame f=new JFrame();
    f.addKeyListener(new MyKeyListener);
    
于 2016-04-01T13:26:12.927 に答える
1

(他の人の回答で示されているように) KeyListener を使用することに加えて、使用している JComponent がフォーカス可能であることを確認する必要がある場合があります。これは、これをコンポーネントに追加することで設定できます (サブクラス化する場合):

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

そして、これをコンストラクターに追加することにより:

setFocusable(true);

または、親クラス/コンテナから関数を呼び出す場合:

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

そして、他の人が言及したすべての KeyListener を実行します。

于 2018-02-23T16:41:59.130 に答える