KeyListener的不工作 [英] KeyListener not working
本文介绍了KeyListener的不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
由于某些原因,我的KeyListener只是不响应的关键pressed事件。
如果它很重要,我在Ubuntu 12.04。应打印键pressed每当关键是pressed,但事实并非如此。
这里的code:
进口java.awt.event中。*;
进口的javax.swing *。
进口java.awt.Graphics;公共类DisplayPanel继承JPanel
{
私人瓷砖[] []瓷砖;
私人生物[]动物;
私人地下城地牢;
私人Player播放器; 公共DisplayPanel(地牢地牢,瓷砖[] []瓷砖,生物[]生物,Player播放器)
{
this.tiles =砖;
this.creatures =动物;
this.dungeon =地牢;
this.player =玩家;
addKeyListener(新DungeonKeyListener());
requestFocus()方法;
} 保护无效paintComponent(图形G)
{
INT最大=(的getWidth()&所述;的getHeight())?的getWidth():的getHeight();
对于(平铺[]行:砖)
{
对于(瓷砖瓷砖:行)
{
如果(瓦= NULL&放大器;!&安培;瓷砖瓷砖的instanceof)
{
tile.draw(克,最大/ tiles.length,最大/瓦[0]。长度);
}
}
}
对于(生物生物:生物)
{
如果(生物= NULL&放大器;!&安培;生物的instanceof生物)
{
creature.draw(克,最大/ tiles.length,最大/瓦[0]。长度);
}
} 如果(玩家= NULL&放大器;!&安培;球员的instanceof播放器)
{
player.draw(克,最大/ tiles.length,最大/瓦[0]。长度);
}
} 私有类DungeonKeyListener扩展KeyAdapter
{
公共无效调用keyReleased(KeyEvent e而)
{
的System.out.println(键pressed!);
。地牢preSS(e.getKey code());
重绘();
}
}
}
解决方案
- 呼叫
super.paintComponent方法
(不涉及您的问题,但会解决一些问题以后) - 请组件可聚焦 - <一个href=\"http://docs.oracle.com/javase/7/docs/api/java/awt/Component.html#setFocusable%28boolean%29\"><$c$c>Component#setFocusable$c$c>
- 使用键绑定超过
的KeyListener
- 使用
组件#requestFocusInWindow
在组件#requestFocus的
...
从Java文档
由于这种方法的焦点行为是与平台相关的,
开发者强烈建议使用requestFocusInWindow时
可能的
块引用>For some reason, my KeyListener just isn't responding to KeyPressed events.
If it matters, I'm on Ubuntu 12.04. It should be printing "Key Pressed" whenever a key is pressed, but it doesn't.
Here's the code:
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(); } } }
解决方案
- Call
super.paintComponent
(not related to you question, but will solve some issues later on)- Make the component "focusable" -
Component#setFocusable
- Use key bindings over
KeyListener
- Use
Component#requestFocusInWindow
overComponent#requestFocus
...From the Java Docs
Because the focus behavior of this method is platform-dependent, developers are strongly encouraged to use requestFocusInWindow when possible
这篇关于KeyListener的不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文