LiL
LiL

Reputation: 31

How to move Key Binding method into its own Class?

I am making a game and have got keybindings working in my GamePanel class. However I want to be able to put my key bindings method in its own separate class, so that other panels of the game can access the method, so I don't have to rewrite it each time. I've moved it over as you can see, but I am getting a null pointer exception on the line that calls the addKeyBinding method. I'm thinking this has something to do with it not knowing what action to call? But I'm not sure. How can I fix this?

GamePanel class:


public class GamePanel extends JPanel implements ActionListener {
    // Global Variables
    private Ball ball;
    private Paddle paddle;
    private GameFrame gameFrame;
    private int width;
    private int height; 
    private Timer timer;
    private int brickHeight = 30;
    private int brickWidth = 60;
    ArrayList<Bricks> brickArray = new ArrayList<Bricks>();
    int brickCount;
    int leftOverSpace;
    private int ballXDir = -1;
    private int ballYDir = -2;
    private boolean play = false;
    private int delay = 8;
    private KeyBindings kBindings;

    // create a constructor
    GamePanel (int gamePanelWidth, int gamePanelHeight) {
        this.setWidth(gamePanelWidth);
        this.setHeight(gamePanelHeight);
        initialiseGame();
        this.isVisible();
    }

    private void initialiseGame() {
        play = false;
        ball = new Ball(10, 520, 30, 30, this); //create the ball object
        paddle = new Paddle(this, 50, 700, 100, 10); //creates paddle object
        initialiseBrickArray();
        
        //initialise key bindings for space, left and right
        kBindings.addKeyBinding(this, KeyEvent.VK_SPACE, "startBall", (evt) -> {
            play = true;
        });
        kBindings.addKeyBinding(this, KeyEvent.VK_LEFT, "moveLeft", (evt) -> {
            paddle.moveLeft();
        });
        kBindings.addKeyBinding(this, KeyEvent.VK_RIGHT, "moveRight", (evt) -> {
            paddle.moveRight();
        });       
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
    }  
}

My new KeyBindings class:

public class KeyBindings implements ActionListener {

    public void addKeyBinding(JComponent comp, int keyCode, String id, ActionListener actionListener) {
        InputMap im = comp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        ActionMap ap = comp.getActionMap();

        im.put(KeyStroke.getKeyStroke(keyCode, 0, false), id);
        ap.put(id, new AbstractAction() {

            @Override
            public void actionPerformed(ActionEvent e) {
                actionListener.actionPerformed(e);
            }
        });

        return;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub

    }
    
}

Upvotes: 0

Views: 162

Answers (2)

camickr
camickr

Reputation: 324157

First of all there is no need for the KeyBindings class to implement ActionListener. You don't actually add an instance of this class to a button as an ActionListener. This is just a class with a convenience method.

You aren't actually changing any property of the KeyBindings class. So this should probably just be a static method of the class:

//public void addKeyBinding(...)
public static void addKeyBinding(...)

Then you invoke it as:

//kBindings.addKeyBinding(...);
KeyBindings.addKeyBinding(...);

Upvotes: 1

zanthia
zanthia

Reputation: 76

You should initialize kBindings in constructor, or somewhere else, but before you call kBindings.addKeyBinding. Just

kBindings = new KeyBindings();

Upvotes: 1

Related Questions