1

私は次のコードを持っています (私はframe.add(new LevelPanel())を拡張する私のメイン メソッドで行いますJFrame。何らかの理由で、このコードKeyListenerは他の人にとってはまったく同じですが、何も認識しません。

キーを押したときに、少なくとも「Got here」と出力する必要があります(そうではありません)。コードはパネルを印刷しますが、パネルは私が押したどのキーにも反応しません。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/*
 * Items represent the things in the level that can be picked up.
 * Subclasses: Gem
 * 
 * @author Tim Ochsner
 * @version 1.0 11/18/2012
 */

public class LevelPanel extends JPanel {
private Game game;
private Level level;
private Player player;
private char[][] table =
        {{'p', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f'},
        {'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'w', 'f', 'f', 'f', 'f', 'f'},
        {'f', 'f', 'f', 'f', 'w', 'f', 'f', 'f', 'f', 'w', 'f', 'f', 'f', 'f', 'f'},
        {'f', 'f', 'f', 'f', 'w', 'f', 'f', 'f', 'w', 'w', 'w', 'f', 'f', 'f', 'f'},
        {'f', 'f', 'f', 'f', 'w', 'f', 'f', 'f', 'f', 'f', 'f', 'w', 'f', 'f', 'f'},
        {'f', 'f', 'f', 'f', 'w', 'f', 'f', 'f', 'f', 'f', 'f', 'w', 'f', 'f', 'f'},
        {'f', 'f', 'f', 'f', 'w', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f'},
        {'w', 'f', 'f', 'f', 'w', 'w', 'w', 'w', 'w', 'f', 'f', 'f', 'f', 'f', 'f'},
        {'w', 'w', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'w', 'f'},
        {'w', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'w', 'f'},
        {'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'w', 'f'},
        {'f', 'f', 'f', 'f', 'f', 'f', 'w', 'w', 'w', 'w', 'f', 'f', 'w', 'w', 'f'},
        {'f', 'f', 'w', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'w', 'f', 'f', 'w', 'f'},
        {'f', 'f', 'w', 'f', 'f', 'f', 'f', 'f', 'f', 'w', 'f', 'f', 'f', 'f', 'f'},
        {'w', 'w', 'w', 'w', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f', 'f'}};

public LevelPanel(Game game)
{
    this.game = game;
    player = game.getPlayer();
    level = new Level(game, table);
    setBackground(Color.WHITE);
    addKeyListener(new ArrowListener());

}

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    level.draw(g);
}

public class ArrowListener implements KeyListener {

    public void keyPressed(KeyEvent e) {
        System.out.println("Got here");
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            if (!(player.getCol() == 14) && level.getTileLayout()[player.getRow() + 1][player.getCol()].isPassable()) {
                System.out.println("Got here");
                player.move(player.getRow() + 1, player.getCol());
                table[player.getRow()][player.getCol()] = 'f';
                table[player.getRow() + 1][player.getCol()] = 'p';
            }
        }

    }

    public void keyReleased(KeyEvent e) {
        System.out.println("Got here");

    }

    public void keyTyped(KeyEvent arg0) {
            System.out.println("Got here");         
    }

}

}
4

1 に答える 1

1

KeyListenerは気まぐれな愛人です。キーバインディングを優先してそれらを避けることをお勧めします

KeyListener1- コンポーネントがフォーカス可能で、2- コンポーネントにフォーカスがある場合にのみイベントを発生させます。キーバインディングを使用すると、この制限を回避できます。

を使用する必要がある場合はKeyListener、最初に を呼び出しsetFocusable(true)LevelPanel次にrequestFocusInWindow.

于 2012-11-26T05:52:17.927 に答える