KeyBindings не отвечает в приложении Swing

Поэтому я пытаюсь написать это приложение, которое в основном представляет собой игру, в которой можно быстрее нажимать клавиши ( 1 для игрока 1 и 0 для игрока 2). Приложение имеет простой графический интерфейс с простым табло, которое должно обновляться, когда игроки нажимают одну из клавиш. Вот скриншот графического интерфейса: http://screencloud.net/v/a6vT берите в голову кнопку запуска, это просто для сброса результатов, я реализую это позже.

Вот файлы кода:

1.GameFrame.java

package MediatorGame;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class GameFrame extends JFrame {

    private GamePanel currentPanel; 

    public GameFrame() {

        currentPanel = new GamePanel();
        setupFrame();
    }

    private void setupFrame(){
        this.setContentPane(currentPanel);
        currentPanel.setFocusable(true);
        currentPanel.requestFocusInWindow();
        this.setSize(450, 300);
    }

}

2.GamePanel.java

package MediatorGame;

import javax.swing.*;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;



@SuppressWarnings("serial")
public class GamePanel extends JPanel{
    private JButton startButton;
    private SpringLayout currentLayout;
    private JLabel p1Label;
    private JLabel p2Label;
    private int p1Score = 0;
    private int p2Score = 0;
    private JLabel p1ScoreLabel;
    private JLabel p2ScoreLabel;
    private InputMap iMap;
    private ActionMap aMap;


    public GamePanel() {
        startButton = new JButton("Start");
        currentLayout = new SpringLayout();
        p1Label = new JLabel("Player 1");
        p2Label = new JLabel("Player 2");
        p1ScoreLabel = new JLabel(String.valueOf(p1Score));
        p2ScoreLabel = new JLabel(String.valueOf(p2Score));
        iMap = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        aMap = getActionMap();

        setupPanel();
    }

    private void setupPanel(){  
        setBackground(new Color(255, 255, 204));
        setLayout(currentLayout);           

        currentLayout.putConstraint(SpringLayout.WEST, startButton, 206, SpringLayout.WEST, this);
        currentLayout.putConstraint(SpringLayout.SOUTH, startButton, -40, SpringLayout.SOUTH, this);
        add(startButton);

        currentLayout.putConstraint(SpringLayout.NORTH, p2Label, 50, SpringLayout.NORTH, this);
        currentLayout.putConstraint(SpringLayout.EAST, p2Label, -62, SpringLayout.EAST, this);
        add(p2Label);

        currentLayout.putConstraint(SpringLayout.WEST, p1Label, 75, SpringLayout.WEST, this);
        currentLayout.putConstraint(SpringLayout.NORTH, p1Label, 0, SpringLayout.NORTH, p2Label);
        add(p1Label);

        currentLayout.putConstraint(SpringLayout.WEST, p1ScoreLabel, 0, SpringLayout.WEST, p1Label);
        currentLayout.putConstraint(SpringLayout.NORTH, p1ScoreLabel, 0, SpringLayout.NORTH, p2ScoreLabel);
        add(p1ScoreLabel);

        currentLayout.putConstraint(SpringLayout.NORTH, p2ScoreLabel, 6, SpringLayout.SOUTH, p2Label);
        currentLayout.putConstraint(SpringLayout.WEST, p2ScoreLabel, 0, SpringLayout.WEST, p2Label);
        add(p2ScoreLabel);

        iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_1, 0), "incP1Score");
        iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_0, 0), "incP2Score");
        aMap.put("incP1Score", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                p1Score += 1;
            }
        });
        aMap.put("incP2Score", new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                p2Score += 1;
            }
        });

     }  
}

3.GUIRunner.java

package MediatorGame;

import javax.swing.UIManager;

public class GUIRunner {

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(
            UIManager.getSystemLookAndFeelClassName());
        } catch(Exception e){ }

        java.awt.EventQueue.invokeLater(new Runnable(){
              public void run() {
                   GameFrame myApp = new GameFrame();
                   myApp.setVisible(true);
              }
        });
    }

}

Я проверил много вопросов. Большинство из них возложили вину на JPanel фокусируемый, и просить о фокусе, неправильно keyEvent коды (например, "1" вместо "1" или "VK_1") или имеющие значение по умолчанию getInputMap() метод вместо getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);, Я, кажется, имел дело со всеми из них, и все же лейбл все еще не обновляется, когда я нажимаю клавиши.

Мой вопрос: что не так? я должен сфокусировать ярлыки вместо всей панели? неправильный код ключа? Я испробовал много предполагаемых решений и просто не могу сделать перерыв!

1 ответ

Решение

Насколько я понимаю, причина, по которой метки не обновляются, заключается в том, что вы не обновляете их:

@Override
public void actionPerformed(ActionEvent e) {
    p1Score += 1;
    p1ScoreLabel.setText(String.valueOf(p1Score));
}

А также:

@Override
public void actionPerformed(ActionEvent e) {
    p2Score += 1;
    p1ScoreLabel.setText(String.valueOf(p2Score));
}
Другие вопросы по тегам