键绑定 esc 始终有效

问题描述

所以我实际上有两个问题,第一个是 hat esc 没有做任何事情,即使它的代码与 w、a 和 s 的工作相同,第二个是当我按下按钮时,没有一个键起作用(我知道它只是框架上的一个标签一个按钮,但这只是一个简单的例子)

Game(){
    
        frame = new JFrame("KeyBinding Demo");
        frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(420,420);
        frame.setLayout(null);
        
        label = new JLabel();
        label.setBackground(Color.red);
        label.setBounds(100,100,100);
        label.setopaque(true);
        b = new JButton();
        b.setBackground(Color.red);
        b.setBounds(400,400,400);
        b.setopaque(true);
        upAction = new UpAction();
        downAction = new DownAction();
        leftAction = new LeftAction();
        rightAction = new RightAction();
        
        label.getInputMap().put(Keystroke.getKeystroke('w'),"upAction");
        label.getActionMap().put("upAction",upAction);
        label.getInputMap().put(Keystroke.getKeystroke('s'),"downAction");
        label.getActionMap().put("downAction",downAction);
        label.getInputMap().put(Keystroke.getKeystroke('a'),"leftAction");
        label.getActionMap().put("leftAction",leftAction);
        label.getInputMap().put(Keystroke.getKeystroke("ESC"),"rightAction");
        label.getActionMap().put("rightAction",rightAction);
        frame.add(b);
        frame.add(label);
        frame.setVisible(true);
    }
    
    public class UpAction extends AbstractAction{

        @Override
        public void actionPerformed(ActionEvent e) {
            label.setLocation(label.getX(),label.getY()-10);
        }       
    }
    public class DownAction extends AbstractAction{

        @Override
        public void actionPerformed(ActionEvent e) {
            label.setLocation(label.getX(),label.getY()+10);   
        }       
    }
    public class LeftAction extends AbstractAction{

        @Override
        public void actionPerformed(ActionEvent e) {
            label.setLocation(label.getX()-10,label.getY());   
        }       
    }
    public class RightAction extends AbstractAction{

        @Override
        public void actionPerformed(ActionEvent e) {
            label.setLocation(label.getX()+10,label.getY());
        }       
    }
}

这是我运行它的地方

public class Main{
    public static void main(String[] args ){
        Game game = new Game();
    }
}

解决方法

label.getInputMap().put(KeyStroke.getKeyStroke("ESC"),"rightAction");

键盘上的标签对 Java 毫无意义。

重要的是 KeyEvent 类中定义的变量:

VK_ESCAPE

因此要创建您使用的 KeyStroke:

label.getInputMap().put(KeyStroke.getKeyStroke("ESCAPE"),"rightAction");

但是当我点击按钮时,按键停止工作

您使用的是默认 InputMap,它仅在组件具有焦点时才起作用。有 3 个 InputMap。阅读 How to Use Key Bindings 上的 Swing 教程。

您应该使用 WHEN_ANCESTOR_OF_COMPONENT 输入映射。并且键绑定应该添加到框架的内容窗格中,而不是标签。

,

您发布的代码有 50 多个错误,请提供完整且可编译的示例。修复错误后,我得到了以下代码:

import java.awt.Color;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.KeyStroke;

class Game
{

final JLabel label;

    
Game()
{       
        var frame = new JFrame("KeyBinding Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(420,420);
        frame.setLayout(null);
        
        label = new JLabel();
        label.setBackground(Color.red);
        label.setBounds(100,100,100);
        label.setOpaque(true);
        
        var b = new JButton();
        b.setBackground(Color.red);
        b.setBounds(400,400,400);
        b.setOpaque(true);
        var upAction = new UpAction();
        var downAction = new DownAction();
        var leftAction = new LeftAction();
        var rightAction = new RightAction();
        
        label.getInputMap().put(KeyStroke.getKeyStroke('w'),"upAction");
        label.getActionMap().put("upAction",upAction);
        label.getInputMap().put(KeyStroke.getKeyStroke('s'),"downAction");
        label.getActionMap().put("downAction",downAction);
        label.getInputMap().put(KeyStroke.getKeyStroke('a'),"leftAction");
        label.getActionMap().put("leftAction",leftAction);
        label.getInputMap().put(KeyStroke.getKeyStroke("ESC"),"rightAction");
        label.getActionMap().put("rightAction",rightAction);
        frame.add(b);
        frame.add(label);
        frame.setVisible(true);
    }
    
    public class UpAction extends AbstractAction{

        @Override
        public void actionPerformed(ActionEvent e) {
            label.setLocation(label.getX(),label.getY()-10);
        }       
    }
    public class DownAction extends AbstractAction{

        @Override
        public void actionPerformed(ActionEvent e) {
            label.setLocation(label.getX(),label.getY()+10);   
        }       
    }
    public class LeftAction extends AbstractAction{

        @Override
        public void actionPerformed(ActionEvent e) {
            label.setLocation(label.getX()-10,label.getY());   
        }       
    }
    public class RightAction extends AbstractAction{

        @Override
        public void actionPerformed(ActionEvent e) {
            label.setLocation(label.getX()+10,label.getY());
        }       
    }

    public static void main(String[] args ){
        Game game = new Game();
    }
}

然后,“ESC”的问题在于它似乎无法识别该字符串,但是当您提供转义键代码时它可以工作,例如像这样:

import java.awt.event.KeyEvent;
[...]
label.getInputMap().put(KeyStroke.getKeyStroke((char) KeyEvent.VK_ESCAPE),"rightAction");