1

現在、Javaでレベルエディタを作成しています。レベルはJPanelにあります。このJPanelの中​​に、ゲーム要素(ヒーロー、敵、木、壁など)を配置します。すべての要素に対して、class.GameElementを使用します。

public class GameElement extends JPanel
 {
protected int posX, posY;
private Color color;


public GameElement(int x, int y, Color color)
{
    this.posX = x;
    this.posY = y;
    this.color = color;

}

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    g.setColor(color);
    g.fillRect(0, 0, 50, 50);
}

}

GameElementクラスもJPanelです。KeyListenerを使用してゲーム要素のヒーローを移動できるようにしたい。

import java.awt.Color;
import java.awt.event.*;

public class Hero extends Entity implements KeyListener
{
public Hero(int x, int y, Color color)
{
    super(x, y, color);


    this.setFocusable(true);
    this.addKeyListener(this);
}

public void keyPressed(KeyEvent k)
{
    if(k.getKeyCode() == KeyEvent.VK_UP)
    {
        this.move(0, -1);
    }
    else if(k.getKeyCode() == KeyEvent.VK_DOWN)
    {
        this.move(0, 1);
    }
    else if(k.getKeyCode() == KeyEvent.VK_LEFT)
    {
        this.move(-1, 0);
    }
    else if(k.getKeyCode() == KeyEvent.VK_RIGHT)
    {
        this.move(1, 0);
        System.out.println("test");
    }
}

public void keyTyped(KeyEvent k)
{

}

public void keyReleased(KeyEvent k)
{

}
}

レベルエディタを起動したとき。ヒーローの表示は画面上で正常に表示されますが、キーボタンを押しても移動しません。正しいJPanelに集中していないからですか?

4

2 に答える 2

6

JPanel間違ったものに焦点を合わせているわけではありませんが、それは焦点を合わせることJPanelができず、 と対話することはできませんKeyEvents。これが、Swing では、コンポーネントにフォーカスがない場合でも Action を KeyStroke にマップできるKey Bindingを使用する方がよい理由です。

于 2013-01-09T12:15:23.727 に答える
1

AWTEventListenerをデフォルトのToolkitに追加して、どの要素にフォーカスがあるかに依存するのではなく、すべての主要なイベントをリッスンすることができます (アプリケーションにフォーカスがある必要があります)。

    AWTEventListener theListener = new AWTEventListener() {
        @Override
        public void eventDispatched(AWTEvent event) {
            System.out.println(event);
        }
    };
    Toolkit toolkit = Toolkit.getDefaultToolkit();
    toolkit.addAWTEventListener(theListener, AWTEvent.KEY_EVENT_MASK);

編集
AWTEventsは一種の低レベル イベントであり、ActionMap / InputMap (または単にregisterKeyboardAction )を使用することを好みます。

于 2013-01-09T12:27:07.950 に答える