java - KeyListener 不会更改变量

标签 java

我一直在研究这个蛇项目,但并不真正理解为什么键监听器实际上没有更改变量 char 键。我还有一些其他的按键监听器示例,它们都工作正常,但由于某种原因我的无法工作。一些帮助将不胜感激。非常感谢您的帮助。

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

    }




}

最佳答案

将构造函数更改为

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

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

关于java - KeyListener 不会更改变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59993212/

相关文章:

Java 等待组件被绘制

java - 将 JSON 解析为 TextView

Java 垃圾回收碎片整理

java - 创建动态变化的ProgressMonitor

java - 重音字符需要多一个字符

JAVA - 使用 FOR、WHILE 和 DO WHILE 循环对 1 到 100 求和

java - 如何解析给定格式的XML文件?

java - 如何禁用推送通知的声音?

java - 单击下拉菜单中的项目后更改 RecyclerView 内容

java - 通过 JAX-RS Jersey 服务使用 Cookie 和 JSON