用键绑定替换keyAdapter

时间:2013-08-04 16:20:43

标签: java swing keylistener key-bindings key-events

我如何在此代码中使用键绑定,因为键适配器不能正常工作?我已经查看了键绑定的文档,但我无法理解如何执行此操作。

private class KeyLis extends KeyAdapter 
{   
    @Override
    public void keyPressed(KeyEvent e) 
    {
        switch (e.getKeyCode())
        {
        case KeyEvent.VK_UP:
            up = true;
            break;
        case KeyEvent.VK_DOWN:
            down = true;
            break;
        case KeyEvent.VK_LEFT:
            left = true;
            break;
        case KeyEvent.VK_RIGHT:
            right = true;
            break;
        }
    }

    @Override
    public void keyReleased(KeyEvent e) 
    {
        switch (e.getKeyCode())
        {
        case KeyEvent.VK_UP:
            up = false;
            break;
        case KeyEvent.VK_DOWN:
            down = false;
            break;
        case KeyEvent.VK_LEFT:
            left = false;
            break;
        case KeyEvent.VK_RIGHT:
            right = false;
            break;
        }
    }
}

谢谢

1 个答案:

答案 0 :(得分:4)

您需要将相应的密钥添加到要应用InputMap的组件的KeyBinding,如下所示:

panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
    KeyStroke.getKeyStroke("pressed UP"), "pressedUPAction");
panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
    KeyStroke.getKeyStroke("released UP"), "releasedUPAction");

panel.getActionMap().put("pressedUPAction", new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent ae) {
        System.out.println("UP Arrow Pressed");
    }
});

panel.getActionMap().put("releasedUPAction", new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent ae) {
        System.out.println("UP Arrow Released");
    }
});

看看这个工作示例:

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

public class SmallExample {

    private JButton button;
    private JPanel panel;

    private void displayGUI() {
        JFrame frame = new JFrame("Small Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        panel = new JPanel() {
            @Override
            public Dimension getPreferredSize() {
                return (new Dimension(100, 100));
            }
        };
        panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
                KeyStroke.getKeyStroke("pressed UP"), "pressedUPAction");
        panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
                KeyStroke.getKeyStroke("released UP"), "releasedUPAction");

        panel.getActionMap().put("pressedUPAction", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                System.out.println("UP Arrow Pressed");
            }
        });

        panel.getActionMap().put("releasedUPAction", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                System.out.println("UP Arrow Released");
            }
        });

        frame.setContentPane(panel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                new SmallExample().displayGUI();
            }
        };
        EventQueue.invokeLater(runnable);
    }
}