Brendan LeFevre
Brendan LeFevre

Reputation: 1

KeyListener wont change variable

I have been working on this snake project, and dont really understand why the keylistener isnt actually changing the variable char key. I have some other examples of keylisteners, and they all work properly, but for some reason mine isnt working. Some help would be appreciated. Thanks a lot for the help.

import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Toolkit;
import java.awt.event.KeyListener;
import java.awt.geom.Ellipse2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.RepaintManager;

public class Main extends JPanel implements Runnable {

    /*
     * 
     * SIZE OF BOARD
     * 
     */

    static GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    static GraphicsDevice[] gs = ge.getScreenDevices();

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

    private static final int DIM_WIDTH = Toolkit.getDefaultToolkit().getScreenSize().width;
    private static final int DIM_HEIGHT = Toolkit.getDefaultToolkit().getScreenSize().height;

    static JFrame frame = new JFrame();
    static JPanel panel = new JPanel();
    static Snake s = new Snake();
    static Main main = new Main();
    KeyListener listener = new Snake();
    boolean black = true;

    public Main() {
        addKeyListener(listener);

    }


    @SuppressWarnings("deprecation")
    public static void main(String[] args) {

         //gs[0].setFullScreenWindow(frame);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setCursor(Cursor.CROSSHAIR_CURSOR);
        frame.setSize(DIM_WIDTH, DIM_HEIGHT);
        frame.add(main);
        frame.setVisible(true);

        (new Thread(new Main())).start();

    }

    // paints the panel
    public void paint(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;

        /*
         * Snake
         */

        //Redraws Background
        g2d.setColor(Color.black);
        g2d.fillRect(0, 0, (int) screenSize.getWidth(), (int) screenSize.getHeight());

        //Draws Border
        g2d.setColor(Color.white);
        g2d.fillRect(0,0, (int)screenSize.getWidth(), 1);
        g2d.fillRect(0,0, 1, (int)screenSize.getHeight());
        g2d.fillRect((int)screenSize.getWidth()-1, 1, 1, (int)screenSize.getHeight());
        g2d.fillRect(0, (int)screenSize.getHeight()-86, (int)screenSize.getWidth(), 10);

        //Draws Snake head
        g2d.setColor(s.getColor());
        g2d.fillRect(s.getX(), s.getY(), 30, 30);

    }
    // Creates Frame, and starts the game

    @Override
    public void run() {

        while (!s.getIsDead()) {
        move();
        }

    }
    public void move() {

            s.move();
            s.death();
            main.repaint();
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {

                e.printStackTrace();
            }
            if (Thread.interrupted()) {
                return;
            }

    }

}



import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


public class Snake implements KeyListener {

    Color c = Color.green;

    //Starting position of Snake
    int x = 50;
    int y = 50;
    char key;
    boolean dead = false;
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();






    public void move() {
        x++;


    }

    public void death() {

        if (x + 30 >= screenSize.getWidth() || y + 115 >= screenSize.getHeight() || y<=0 || x<=0) {
            c = Color.red;
            dead = true;

        }
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public Color getColor() {
        return c;

    }

    public boolean getIsDead() {
        return dead;
    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyPressed(KeyEvent e) {
        key = 'w';


    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub

    }




}

Upvotes: 0

Views: 41

Answers (2)

Joseph Hawkes-Cates
Joseph Hawkes-Cates

Reputation: 2423

As @azurefrog mentioned, your keyPressed method is setting key to 'w' every time. You need to use the KeyEvent passed in as a parameter to that method to get the key that was pressed. Your keyPressed method should look something like this:

    @Override
    public void keyPressed(KeyEvent e) {
        key = e.getKeyChar();
    }

Upvotes: 0

JavaMan
JavaMan

Reputation: 1217

Change your constructor to

public Main() {
    addKeyListener(listener);
    setFocusable(true);
    requestFocus();
}

But take a look at this question, you should not use KeyListeners. java keylistener not called

Upvotes: 1

Related Questions