Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
捕获鼠标事件,但不捕获KeyEvents Java JComponant_Java_Swing_Key Bindings_Jcomponent_Key Events - Fatal编程技术网

捕获鼠标事件,但不捕获KeyEvents Java JComponant

捕获鼠标事件,但不捕获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

我正在做一个叫旅鼠的老游戏项目,游戏面板的原理很好,可以接收MouseEvents,但不能接收KeyEvents,这对我来说不是很合乎逻辑,所以我复制了这个文件的代码,让大家看看发生了什么

GamePanel类扩展了JComponent SWING类

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)

关键事件仅分配给可聚焦组件

默认情况下,JPanel不可聚焦,因此不会接收关键事件

如果您试图基于KeyEvent调用某种类型的
操作
,那么您应该使用
键绑定
,而不是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());
        }
    });