【问题标题】:I'm not sure why my keybinds are not working. [Java Keybinding]我不确定为什么我的键绑定不起作用。 [Java 键绑定]
【发布时间】:2020-05-21 20:10:29
【问题描述】:

将 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");   
    }

}

【问题讨论】:

    标签: java swing key-bindings


    【解决方案1】:
    panel = new JPanel();
    panel.setLayout(new BorderLayout());          
    panel.setSize(width,height);
    panel.add(menuGraphics,BorderLayout.CENTER);
    

    您创建一个带有 BorderLayout 的面板,然后将您的“menuGraphics”组件添加到此面板。这意味着 menuGraphics 组件将获得焦点。

    默认情况下,面板必须具有焦点,键绑定才能使用默认 InputMap。但是,您将键绑定添加到“面板”。由于它没有焦点,因此绑定不起作用。

    解决办法是:

    1. 将键绑定添加到“menuGraphics”组件,或
    2. 在将绑定添加到 InputMap 时使用JComponent.WHEN_IN_FOCUSED_WINDOW InputMap。这意味着即使“面板”组件没有焦点,键绑定也会起作用。

    阅读 How to Use Key Bindings 上的 Swing 教程部分,了解有关各种 InputMap 的更多信息。

    您还可以查看 Motion Using the Keyboard 以获取键绑定的工作示例。

    【讨论】:

      猜你喜欢
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 2011-09-29
      相关资源
      最近更新 更多