钥匙和;按钮兼容性Java

时间:2014-05-05 07:37:50

标签: java swing jbutton key-bindings

我已经用Java创建了自己的俄罗斯方块版本,我添加了使用JButton和某些键盘键移动形状的可能性。我使用的代码片段如下:

    leftButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent E) {

            moveLeft();

        }
    });

    rightButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent E) {

            moveRight();

        }
    });

    rotateButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent E) {


            rotateMovingShape();

        }

    });


    myPanel.addKeyListener(new KeyAdapter(){


        public void keyPressed(KeyEvent event) {
                int keyCode = event.getKeyCode();
                if (keyCode == event.VK_A)
                {
                  moveLeft();

                }
                if (keyCode == event.VK_D)
                {
                   moveRight();
                }
                if (keyCode == event.VK_S)
                {
                    rotateMovingShape();
                }
            }



    });

我遇到的问题是,在使用JButtons之后,我无法再用键盘键控制形状。我怀疑它与获得/失去焦点有关,但我不确定。谁能告诉我发生了什么事?

2 个答案:

答案 0 :(得分:2)

您遇到了这个问题,因为您使用的是KeyListener,而不是您需要使用Key Bindings。例如:

    component.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_A,0), "aPressed");
    component.getActionMap().put("aPressed", new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("a key");
        }
    });
    component.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_D,0), "dPressed");
    component.getActionMap().put("dPressed", new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("d key");
        }
    });
    // other bindings

其中component是您的JPanel

答案 1 :(得分:0)

KeyListener仅在组件具有键盘焦点时才接收键事件。单击按钮可将焦点转移到它们并远离面板,因此您无法获得事件。以下任何一种方法都可以解决这个问题:

  • 在按钮上调用setFocusable(false);,以便他们不会窃取焦点。

  • 也将KeyListener添加到按钮中。

  • 使用key bindings代替KeyListener,这样您就可以按下按键,无论组件是否具有焦点。