Я не уверен, почему мои клавиши не работают. [Java Связывание клавиш] - PullRequest
0 голосов
/ 05 февраля 2020

Связывает W, S и I, k с левой и правой ракеткой понга. Согласно Eclipse коды попадают в класс p1_upaction, расширяет AbstractAction, но не запускает publi c 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");   
    }

}

1 Ответ

0 голосов
/ 05 февраля 2020
panel = new JPanel();
panel.setLayout(new BorderLayout());          
panel.setSize(width,height);
panel.add(menuGraphics,BorderLayout.CENTER);

Вы создаете панель с BorderLayout, а затем добавляете свой компонент menuGraphics на эту панель. Это означает, что компонент menuGraphics будет иметь фокус.

По умолчанию на панели должен быть фокус, чтобы привязки клавиш работали с InputMap по умолчанию. Однако вы добавляете привязки клавиш к «панели». Поскольку у него нет фокуса, привязки не работают.

Решение состоит в том, чтобы:

  1. добавить привязки клавиш к компоненту menuGraphics, или
  2. использовать JComponent.WHEN_IN_FOCUSED_WINDOW InputMap при добавлении привязок в InputMap. Это означает, что привязки клавиш будут работать, даже если компонент «панель» не имеет фокуса.

Прочитайте раздел из учебника Swing по Как использовать привязки клавиш для больше информации о различных картах ввода.

Вы также можете проверить Движение с помощью клавиатуры для рабочего примера привязки клавиш.

...