所以我实际上有两个问题,第一个问题是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();
}
}
2条答案
按热度按时间lymgl2op1#
你发布的代码有50多个错误,请提供一个完整的可编译的例子。修复错误后,我得到了以下代码:
然后,“esc”的问题是,它似乎无法识别该字符串,但是当您提供escape的键代码时,它仍然有效,例如:
kxe2p93d2#
键盘上的标签对java来说毫无意义。
重要的是keyevent类中定义的变量:
因此,要创建您使用的击键:
但当我点击按钮时,按键停止工作
您使用的是默认的inputmap,它仅在组件具有焦点时工作。有3个输入Map。阅读有关如何使用键绑定的swing教程。
你应该使用
WHEN_ANCESTOR_OF_COMPONENT
输入Map。键绑定应该添加到框架的内容窗格,而不是标签。