KeyListener not registering pressed keys

Viewed 37
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferStrategy;

import javax.swing.JFrame;

public class General implements Runnable, KeyListener{
    
    Thread thread;
    boolean running;
    JFrame frame;
    Canvas canvas;
    BufferStrategy bs;
    Graphics g;
    int x = 20;
    int y = 500;
    
    public void Display(String title, int width, int height) {
        frame = new JFrame(title);
        frame.setPreferredSize(new Dimension(width, height));
        frame.setMaximumSize(new Dimension(width, height));
        frame.setMinimumSize(new Dimension(width, height));
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        canvas = new Canvas();
        frame.add(canvas);
        frame.pack();
        frame.setVisible(true);
    }
    public void init() {
        Display("Igrica", 600, 600);
    }
    public synchronized void start() {
        if(running) {
            return;
        }
        thread = new Thread(this);
        thread.start();
        running = true;
    }
    
    public synchronized void stop() {
        if(!running) {
            return;
        }
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        running = false;
    }
    public void tick() {
        
    }
    public void render() {
        bs = canvas.getBufferStrategy(); 
        if(bs == null) {
            canvas.createBufferStrategy(3);
            return;
        }
        g = bs.getDrawGraphics();
        //Draw here
        
        g.setColor(Color.green);
        g.fillRect(0, 0, 600, 600);
        g.setColor(Color.WHITE);
        g.fillRect(x, y, 60, 60);
        //To here
        bs.show();
        g.dispose();
    }
    
    public void run() {
        init();
        int fps = 60;
        double timePerTick = 1000000000 / fps;
        double delta = 0;
        long now;
        long lastTime = System.nanoTime();
        
        while(running) {
            
            now = System.nanoTime();
            delta += (now - lastTime) / timePerTick;
            lastTime = now;
            
            if(delta >= 1) {
                tick();
                render();
                delta --;
            }
        }
    }
    @Override
    public void keyTyped(KeyEvent e) {
        
    }
    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode()== KeyEvent.VK_SPACE) {
            System.out.println("Pressed");
            y += 10;
        }
    }
    @Override
    public void keyReleased(KeyEvent e) {
        
    }

}

So, I'm trying to make a simple 2D video game, and for that I need input. So I tried adding KeyListener, but it didn't seem to work, so I thought I did something wrong in the first part of my code, so I added one line that prints Pressed when I press space, but it doesn't seem to do anything. Any advice?

1 Answers

You have to add:

frame.addKeyListener(this);

or if canvas is focusable:

canvas.addKeyListener(this);

I have made some test and your method Display can be like this:

public void Display(String title, int width, int height) {
    frame = new JFrame(title);
    frame.setPreferredSize(new Dimension(width, height));
    frame.setMaximumSize(new Dimension(width, height));
    frame.setMinimumSize(new Dimension(width, height));
    frame.setResizable(false);
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(new BorderLayout());

    canvas = new Canvas();
    canvas.addKeyListener(this);

    frame.getContentPane().add(canvas, BorderLayout.CENTER);

    frame.addWindowListener(new WindowAdapter() {

        @Override
        public void windowActivated(WindowEvent e) {
            canvas.requestFocusInWindow();
        }
    });

    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}
Related