java - 我不确定为什么我的键绑定不起作用。[Java 键绑定]
问题描述
将 W,S 和 I,k 绑定到乒乓球的左右桨。根据 Eclipse,代码进入类 p1_upaction 扩展 AbstractAction 但不运行 public void actionPerformed(ActionEvent e)。我不确定该怎么做。KeyInput 被称为操作未注册。
public void frame() {
frame = new JFrame("Pong");
frame.setSize(width,height);
frame.setLayout(new BorderLayout());
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = frame.getContentPane();
frameWidth = frame.getWidth();
frameHeight = frame.getHeight();
menuGraphics = new menuGraphic();
menuGraphics.addMouseMotionListener(this);
menuGraphics.addMouseListener(this);
gameGraphics = new gameGraphic(puck,p1,p2);
panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setSize(width,height);
panel.add(menuGraphics,BorderLayout.CENTER);
keyInput();
menuState = true;
c.add(panel);
frame.setVisible(true);
puck = new Puck(frameWidth/2,frameHeight/2,20,20);
p1 = new Paddle(frameWidth/8,frameHeight/2,20,100);
p2 = new Paddle(frameWidth/8*7-20,frameHeight/2,20,100);
puck.setPaddle(p1, p2);
p1.setPuck(puck);
p2.setPuck(puck);
}
public void keyInput() {
p1_upAction = new p1_upaction();
p1_downAction = new p1_downaction();
p2_upAction = new p2_upaction();
p2_downAction = new p2_downaction();
panel.getInputMap().put( KeyStroke.getKeyStroke( "W" ),"p1_moveUp" );
panel.getActionMap().put("p1_moveUp", p1_upAction);
panel.getInputMap().put( KeyStroke.getKeyStroke( "S" ),"p1_moveDown" );
panel.getActionMap().put("p1_moveDown", p1_downAction);
panel.getInputMap().put( KeyStroke.getKeyStroke( "I" ),"p2_moveUp" );
panel.getActionMap().put("p1_moveUp", p2_upAction);
panel.getInputMap().put( KeyStroke.getKeyStroke( "K" ),"p2_moveDown" );
panel.getActionMap().put("p1_moveDown", p2_downAction);
}
class p1_upaction extends AbstractAction {
public void actionPerformed(ActionEvent e) {
System.out.println("up");
}
}
解决方案
panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setSize(width,height);
panel.add(menuGraphics,BorderLayout.CENTER);
您创建一个带有 BorderLayout 的面板,然后将您的“menuGraphics”组件添加到此面板。这意味着 menuGraphics 组件将获得焦点。
默认情况下,面板必须具有焦点才能使键绑定与默认 InputMap 一起使用。但是,您将键绑定添加到“面板”。由于它没有焦点,因此绑定不起作用。
解决方案是:
- 将键绑定添加到“menuGraphics”组件,或
JComponent.WHEN_IN_FOCUSED_WINDOW
在将绑定添加到 InputMap 时使用InputMap。这意味着即使“面板”组件没有焦点,键绑定也会起作用。
阅读 Swing 教程中有关如何使用键绑定的部分,以获取有关各种 InputMap 的更多信息。
您还可以查看Motion Using the Keyboard以获取键绑定的工作示例。
推荐阅读
- soundcloud - Soundcloud api 获取用户曲目
- javascript - 访问 require-d 类的未定义方法时没有 TypeScript 错误
- r - 有没有办法在 R 中定义当前季度?
- perl - 评估子程序时是否遵循 perl 模块的使用顺序?
- windows - 从 qmake 执行 Powershell 无限期挂起
- c# - Web 套接字执行延迟(可能)和其他一些问题
- laravel - CSRF 令牌不匹配 larave-echo-server 与 nuxt
- bash - 如何对目录中所有带有 json 扩展名的文件运行 bash 脚本?
- r - 根据是否存在不需要的变量组合,将观察结果替换为 NA
- reactjs - React - 如何将列表中的按钮映射到它们所在的对象?