【问题标题】:KeyListener for Escape in JPanel [duplicate]JPanel中转义的KeyListener [重复]
【发布时间】:2018-05-18 02:05:45
【问题描述】:

我在 JFrame 中有一个 JPanel,想为 Escapebutton 创建一个 KeyListener。我已经将 ActionListeners 用于 Buttons 和一个 MouseListener,它们都可以工作。我不知道为什么 KeyListener 不起作用。该面板中没有其他内容,因此该面板应该集中。我还尝试了 e.getKeyCode() 或 e.getKeyChar() 以及 Escape 以外的其他键的几种组合。

public GamePanel(GameState gameState, Window window) {
    game = gameState;
    myWindow = window;
    renderer = new Renderer();
    setFocusable(true);
    addMouseListener(this);
    addKeyListener(new KeyListener() {
        @Override
        public void keyPressed(KeyEvent e) {
            if( e.getKeyCode() == KeyEvent.VK_ESCAPE) {
                System.out.println("escape");
            }

        }

        @Override
        public void keyReleased(KeyEvent e) {
            // TODO Auto-generated method stub

        }

        @Override
        public void keyTyped(KeyEvent e) {
            // TODO Auto-generated method stub

        }
    });
    add(renderer);
    setLayout(null);
    setBackground(Color.CYAN);
    setPreferredSize(new Dimension(8000, 600));


    timer = new Timer(20, this);
    timer.start();
}

【问题讨论】:

标签: java swing keylistener


【解决方案1】:

您可以为整个帧的 Escape 键注册一个侦听器。

Action action = ...;
String name = "Escape"; // I think the exact name doesn't matter
JComponent pnl = frame.getRootPane();
KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
pnl.getActionMap().put(name, action);
pnl.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(keyStroke, name);

【讨论】:

  • (1+) 一个动作就像一个动作监听器。阅读 How to Use Actions 上的 Swing 教程中的部分以获取更多信息。以上是使用Key Bindings的例子。该教程还有一个关于How to Use Key Bindings 的部分,您可以继续阅读。
  • 1+是什么意思?
  • 这只是意味着我对你的答案投了赞成票,因为 Key Bindings 是使用方法,而不是 KeyListener。
  • 啊,谢谢你的解释
猜你喜欢
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 2014-06-26
  • 2014-06-04
  • 2012-01-01
  • 2014-05-06
  • 2013-05-31
  • 2018-07-07
相关资源
最近更新 更多