KeyListener不会更改变量

问题描述 投票:0回答:2

我一直在从事这个蛇项目,并且真的不理解为什么键侦听器实际上并没有更改可变字符键。我还有其他一些例子,它们都能正常工作,但是由于某种原因我的工作不正常。一些帮助,将不胜感激。非常感谢您的帮助。

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

    }




}
java
2个回答
1
投票

将构造函数更改为

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

但是看看这个问题,您不应该使用KeyListeners。java keylistener not called


0
投票

正如azurefrog所说,您的keyPressed方法每次都将键设置为'w'。您需要使用传递给该方法的参数的KeyEvent来获取按下的键。您的keyPressed方法应该像这样:

    @Override
    public void keyPressed(KeyEvent e) {
        key = e.getKeyChar();
    }
© www.soinside.com 2019 - 2024. All rights reserved.