java键绑定esc到always work

klh5stk1  于 2021-06-27  发布在  Java
关注(0)|答案(2)|浏览(346)

所以我实际上有两个问题,第一个问题是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, 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();
    }
}
lymgl2op

lymgl2op1#

你发布的代码有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”的问题是,它似乎无法识别该字符串,但是当您提供escape的键代码时,它仍然有效,例如:

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

kxe2p93d2#

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

键盘上的标签对java来说毫无意义。
重要的是keyevent类中定义的变量:

VK_ESCAPE

因此,要创建您使用的击键:

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

但当我点击按钮时,按键停止工作
您使用的是默认的inputmap,它仅在组件具有焦点时工作。有3个输入Map。阅读有关如何使用键绑定的swing教程。
你应该使用 WHEN_ANCESTOR_OF_COMPONENT 输入Map。键绑定应该添加到框架的内容窗格,而不是标签。

相关问题