【问题标题】:how to key-bind ESC如何键绑定ESC
【发布时间】:2021-01-04 11:25:24
【问题描述】:

我的问题是 ESC 什么都不做,即使它与 w、a 和 s 的代码相同,但当我按下按钮时,w、a 和 s 不再起作用。这段代码应该做的是显示带有 JLabel 的 JFrame,当我分别按 w、s、a 和 ESC 时,该 JLabel 应该向上、向下、向左和向右移动。这是我用作指导的视频(我并不是暗示这是一个糟糕的视频)https://www.youtube.com/watch?v=IyfB0u9g2x0&t=118s

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, 100);
        label.setOpaque(true);
        b = new JButton();
        b.setBackground(Color.red);
        b.setBounds(400, 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();
    }
}

【问题讨论】:

    标签: java eclipse key-bindings


    【解决方案1】:
    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 输入映射。并且键绑定应该添加到框架的内容窗格中,而不是标签。

    【讨论】:

    【解决方案2】:

    您发布的代码有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, 100);
            label.setOpaque(true);
            
            var b = new JButton();
            b.setBackground(Color.red);
            b.setBounds(400, 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");
    

    【讨论】:

    • 那是我 100% 的错,我在另一个班级运行游戏,然后就可以了
    • 你确实解决了 esc 问题,但是当我点击按钮时,按键停止工作
    • 我没有遇到这个问题,如果我点击按钮它仍然有效。您是否完全按照应用了以下更改的方式运行了我的代码?
    • 是的,一切都一样,我应用了 esc 更改,导入也一样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    相关资源
    最近更新 更多