2012-11-13 92 views
2

出于某种原因,我的KeyListener只是没有响应KeyPressed事件。KeyListener不工作

如果重要,我在Ubuntu 12.04上。每按一次键就应该打印“Key Pressed”,但不是。

下面的代码:

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

public class DisplayPanel extends JPanel 
{ 
    private Tile[][] tiles; 
    private Creature[] creatures; 
    private Dungeon dungeon; 
    private Player player; 

    public DisplayPanel(Dungeon dungeon, Tile[][] tiles, Creature[] creatures, Player player) 
    { 
     this.tiles = tiles; 
     this.creatures = creatures; 
     this.dungeon = dungeon; 
     this.player = player; 
     addKeyListener(new DungeonKeyListener()); 
     requestFocus(); 
    } 

    protected void paintComponent(Graphics g) 
    { 
     int maximum = (getWidth() < getHeight()) ? getWidth() : getHeight(); 
     for (Tile[] row : tiles) 
     { 
      for (Tile tile : row) 
      { 
       if (tile != null && tile instanceof Tile) 
       { 
        tile.draw(g, maximum/tiles.length, maximum/tiles[0].length); 
       } 
      } 
     } 
     for (Creature creature : creatures) 
     { 
      if (creature != null && creature instanceof Creature) 
      { 
       creature.draw(g, maximum/tiles.length, maximum/tiles[0].length); 
      } 
     } 

     if (player != null && player instanceof Player) 
     { 
      player.draw(g, maximum/tiles.length, maximum/tiles[0].length); 
     } 
    } 

    private class DungeonKeyListener extends KeyAdapter 
    { 
     public void keyReleased(KeyEvent e) 
     { 
      System.out.println("Key pressed!"); 
      dungeon.press(e.getKeyCode()); 
      repaint(); 
     } 
    } 
} 
+0

请问您的面板具有焦点?您是否尝试将KeyListener添加到根窗口? –

回答

7
  • 呼叫super.paintComponent(不涉及您的问题,但可以解决以后对一些问题)
  • 使组件 “可聚焦” - Component#setFocusable
  • 使用key bindings超过KeyListener
  • 使用Component#requestFocusInWindow超过Component#requestFocus ...

从Java文档

因为此方法的焦点行为与平台相关的, 开发者强烈建议使用requestFocusInWindow时 可能

+0

干杯。关于第三点,我们必须使用KeyListeners进行作业:/ –

+0

另外,调用super.paintComponent有什么意义? –

+0

'paintComponent'是绘画链中的一个链接。超级版本确保UI保持一致状态的重要工作。除非你愿意接管它的责任,否则你应该调用'super.paintComponent' – MadProgrammer