当前位置: 代码迷 >> J2SE >> ,为什么加上其他面板后,对于键盘的监听没用了
  详细解决方案

,为什么加上其他面板后,对于键盘的监听没用了

热度:65   发布时间:2016-04-23 20:42:11.0
求助,为什么加上其他面板后,对于键盘的监听没用了?
本人学习制作的贪吃蛇游戏,在不加控制面板和说明面板时,游戏面板的蛇可以根据按键改变方向:
public class MainFrame {

public static void main(String[] args) {
// TODO 自动生成的方法存根
GamePanel gamePanel = new GamePanel();
OptionsPanel optionsPanel = new OptionsPanel();
JPanel infoPanel = new InfoPanel();
Snake snake = new Snake();
Food food = new Food();
Ground ground = new Ground();
Controller controller = new Controller(
snake, food, ground, gamePanel);

JFrame jf = new JFrame();
jf.setTitle("HQS贪吃蛇");

//不使用布局管理器!运用绝对布局!
jf.setLayout(null);
jf.setResizable(false);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setSize(Global.WIDTH * Global.CELL_SIZE + 20
, Global.HEIGHT * Global.CELL_SIZE + 250);
gamePanel.setSize(Global.WIDTH * Global.CELL_SIZE
, Global.HEIGHT * Global.CELL_SIZE);
gamePanel.setBorder(new EtchedBorder(EtchedBorder.LOWERED));

//添加游戏面板
gamePanel.setBounds(5, 10, Global.WIDTH * Global.CELL_SIZE
, Global.HEIGHT * Global.CELL_SIZE);
jf.getContentPane().add(gamePanel);

//添加控制面板
/*optionsPanel.setBounds(5, 415, 460, 200);
jf.getContentPane().add(optionsPanel);

//添加说明面板
infoPanel.setBounds(470, 415, 235, 200);
jf.getContentPane().add(infoPanel);
*/
gamePanel.addKeyListener(controller);
snake.addSnakeListener(controller);
jf.addKeyListener(controller);

jf.setVisible(true);
controller.newGame();
System.out.println("After running!");
}

}After running!");
}

}



但将控制面板和说明面板加上后,键盘监听器就没用了。按键蛇头没反应!
引用
//添加控制面板
optionsPanel.setBounds(5, 415, 460, 200);
jf.getContentPane().add(optionsPanel);

//添加说明面板
infoPanel.setBounds(470, 415, 235, 200);
jf.getContentPane().add(infoPanel);



这是监听类:
public class Controller extends KeyAdapter implements SnakeListener {

private Snake snake;
private Food food;
private Ground ground;
private GamePanel gamePanel;

public Controller(Snake snake, Food food, Ground ground, GamePanel gamePanel) {
super();
this.snake = snake;
this.food = food;
this.ground = ground;
this.gamePanel = gamePanel;
}
public void keyPressed(KeyEvent e) {
// TODO 自动生成的方法存根
super.keyPressed(e);

System.out.println("key press~!");
//根据键盘按键,来改变方向
switch(e.getKeyCode()){
case KeyEvent.VK_UP:
System.out.println("UP");
snake.changeDirection(Snake.UP);
break;
case KeyEvent.VK_DOWN:
System.out.println("DOWN");
snake.changeDirection(Snake.DOWN);
break;
case KeyEvent.VK_LEFT:
System.out.println("LEFT");
snake.changeDirection(Snake.LEFT);
break;
case KeyEvent.VK_RIGHT:
System.out.println("RIGHT");
snake.changeDirection(Snake.RIGHT);
break;
default:
System.out.println("null");
break;
}
}
@Override
public void SnakeMove(Snake snake) {
// TODO 自动生成的方法存根

if(food.isEatFood(snake)){
snake.eatFood();
food.newFood(ground.getPoint());
}

if(ground.isSnakeEatRock(snake)){
snake.die(false);
}

if(snake.isEatBody()){
snake.die(false);
}
gamePanel.dispaly(snake, food, ground);
}

public void newGame(){
snake.start();
food.newFood(ground.getPoint());
}
}

求助一下,这是哪里有问题!
------解决方案--------------------
JComponent和其子类有个grabFocus(),你试试
  相关解决方案