捕获鼠标事件,但不捕获KeyEvents Java JComponant
我正在做一个叫旅鼠的老游戏项目,游戏面板的原理很好,可以接收MouseEvents,但不能接收KeyEvents,这对我来说不是很合乎逻辑,所以我复制了这个文件的代码,让大家看看发生了什么 GamePanel类扩展了JComponent SWING类捕获鼠标事件,但不捕获KeyEvents Java JComponant,java,swing,key-bindings,jcomponent,key-events,Java,Swing,Key Bindings,Jcomponent,Key Events,我正在做一个叫旅鼠的老游戏项目,游戏面板的原理很好,可以接收MouseEvents,但不能接收KeyEvents,这对我来说不是很合乎逻辑,所以我复制了这个文件的代码,让大家看看发生了什么 GamePanel类扩展了JComponent SWING类 public class GameFrame { private class GamePanel extends JComponent { GamePanel(Dimension dim) { setPreferred
public class GameFrame {
private class GamePanel extends JComponent {
GamePanel(Dimension dim) {
setPreferredSize(dim);
//first version of the question was with the keyListner
/*addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
super.keyPressed(e);
System.out.println(e.getKeyCode());
//nothing show up
}
});*/
//I tried using this, but it didn't work
//getInputMap().put(KeyStroke.getKeyStroke("A"), "action");
// this works cause we use the right inputMap not the one by default
getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke("A"), "action");
getActionMap().put("action",new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("A is pressed");
//now it works
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
System.out.println(e.getPoint());
}
});
setVisible(true);
}
}
private JFrame window;
private GamePanel panel;
public GameFrame() {
window = new JFrame("Test");
window.setLocationRelativeTo(null);
panel = new GamePanel(new Dimension(400, 400));
window.setContentPane(panel);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}
public static void main(String[] args) {
new GameFrame();
}
}
用解决方案更新
- 我了解到JComponant是不可聚焦的,因此它不接收KeyEvents,因此我们必须使用Key Bindings方法
- 我发现每个JComponent都有三个输入映射,分别由WHEN_在WHEN_FOCUSED_窗口中、WHEN_FOCUSED、WHEN_FOCUSED_组件的WHEN_祖先所引用,我们必须确保在工作中使用正确的输入映射
- 有关更多信息,请查看并检查方法getInputMap()和getInputMap(int)
操作
,那么您应该使用键绑定
,而不是KeyListener。键绑定将允许您监听击键
,即使组件没有焦点
阅读Swing教程中的部分,了解更多信息和工作示例。只要在JFrame中添加一个KeyListener,就可以解决这个问题,以防我们不需要创建动作和内容 只有在没有其他可聚焦组件的情况下,此解决方案才可能实现 在GameFrame.java文件中 在函数void init()中; 加
在问题中包含代码。如果您的项目曾经移动或消失,这个问题(目前的情况)对未来的读者来说将是无用的。@VGR好的,我将更新这个问题,以便代码可以留在这里发布一个正确的问题来演示这个问题。您的问题是关于面板上的按键。因此,您只需要一个带有JPanel的JFrame。这大约是5行代码。然后,您需要创建密钥绑定,因此需要创建一个操作和一个击键,并将其添加到绑定中。另外10行代码。因此,一个类中的代码总数不超过20行,如果我们愿意,我们可以轻松阅读或复制/粘贴/编译和测试。@camickr我已经更新了问题,使其代码更少,问题更容易理解。这不是一个简单的问题。1) 它应该在单个源文件中,以便我们可以复制/粘贴/编译/测试。2) 不需要枚举。您只是尝试测试一个概念,因此保持逻辑简单。3) 不需要定制“游戏组件”。同样,您试图学习的概念是向面板添加键绑定。在创建自定义组件之前,了解使用JDK组件的基本概念。它更容易调试。4) 你没有听我关于使用正确InputMap的评论。5) 你也在论坛上搜索过使用InputMap/ActionMap的例子吗?我想知道为什么MouseListener可以工作,而KeyListener不行?几天前,我有相同的代码,它过去可以工作,但现在不行了,所以我不知道发生了什么变化,我真的不想调用一个动作或创建一个新动作,当单击按钮时,我只想将键值发送到另一个classI使用了键绑定,但仍然无法工作,检查要点,我已经更新了,问题如下well@SafiyZaghbane,
我想知道为什么鼠标听筒可以工作,而键盘听筒不行?
-我的第一句话已经回答了…单击按钮时,
单击按钮和键入字符之间有什么关系<代码>我已经使用了键绑定,但仍然不起作用,-有3个InputMaps。您使用的是默认设置,该设置仅在组件具有焦点时有效,而组件没有。试试其他的InputMaps。唯一有效的方法是帧上没有其他可聚焦组件。使用KeyListener并不是Swing解决方案,因为Key Bindings API对于Swing来说更新且更灵活。在AWT中使用KeyListener是因为没有其他选项。@camickr好的,我“记住这一点,并将其添加到我的答案中。”
window.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed (KeyEvent e) {
super.keyPressed(e);
System.out.println("test "+e.getKeyChar());
}
});