【问题标题】:JAVA linux KeyListener seems not workingJAVA linux KeyListener 似乎不起作用
【发布时间】:2017-07-08 18:22:39
【问题描述】:

我正在开发 JAVA 蛇游戏,但我的 KeyListener 似乎由于某种原因无法正常工作。我试图寻找答案,但找不到任何有用的东西。我是 JAVA 的初学者,所以我不知道我是否正确使用了 keylistener。我根本没有输出。

public class GameBoard extends JPanel implements Runnable, KeyListener{
    /**
     * 
     */
    private boolean up, down, right, left; 

    private Thread thread;
    private boolean running;
    private long targetTime;

    public GameBoard() {
        setPreferredSize(new Dimension(WIDTH,HEIGHT));
        setFocusable(true);
        requestFocus(); 
        addKeyListener(this);
    }

    @Override
    public void keyPressed(KeyEvent e) {
        int k = e.getKeyCode();
        System.out.println("pressed");
        if( k == KeyEvent.VK_W || k == KeyEvent.VK_UP) up = true;
        if( k == KeyEvent.VK_S || k == KeyEvent.VK_DOWN) down = true;
        if( k == KeyEvent.VK_A || k == KeyEvent.VK_LEFT) left = true;
        if( k == KeyEvent.VK_D || k == KeyEvent.VK_RIGHT) right = true;
    }

    @Override
    public void keyReleased(KeyEvent e) {
        int k = e.getKeyCode();
        System.out.println("Released");
        if( k == KeyEvent.VK_W || k == KeyEvent.VK_UP) up = false;
        if( k == KeyEvent.VK_S || k == KeyEvent.VK_DOWN) down = false;
        if( k == KeyEvent.VK_A || k == KeyEvent.VK_LEFT) left = false;
        if( k == KeyEvent.VK_D || k == KeyEvent.VK_RIGHT) right = false;
    }

    @Override
    public void keyTyped(KeyEvent e) {
        int k = e.getKeyCode();
        System.out.println("typed");
    }

    @Override
    public void run() {
        if(running) return;
        init();
        while(running) {
            startTime = System.nanoTime();

            update();
            requestRender();


            elapsed = System.nanoTime()-startTime;
            wait = targetTime - elapsed / 10000000;
            if (wait > 0) {
                try {
                    Thread.sleep(wait);
                }catch(Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private void init() {
        addKeyListener(this);
    }


    private void update() {

            if(up && dy == 0) {
                dy = -SIZE;
                dx = 0;
            }
            if(down && dy == 0) {
                dy = SIZE;
                dx = 0;
            }
            if(left && dx == 0) {
                dx = -SIZE;
                dy = 0;
            }
            if(right && dy == 0) {
                dx = SIZE;
                dy = 0;
            }

            if(dy!=0 || dx!= 0) {
                for( int i = snake.size() -1 ;i > 0; i-- ) {
                    snake.get(i).setPosition(snake.get(i-1).getX(),snake.get(i-1).getY());
                }
            }
            head.move(dx,dy);

            if(head.getX() < 0 ) head.setX(WIDTH);
            if(head.getY() < 0 ) head.setY(HEIGHT);
            if(head.getX() > WIDTH) head.setX(0);
            if(head.getY() > HEIGHT) head.setY(0);
    }

    }

}

【问题讨论】:

  • 欢迎来到 Stack Overflow!我想 95% 的代码与您的问题无关。请创建一个 Minimal, Complete and Verifiable Example 来证明您的问题。
  • 已编辑,谢谢@JoeC
  • 正如@FredK 所建议的那样,您没有正确调用JPanel,而是正在初始化一个阻塞线程。所以我想如果你发布你的主要方法,我们可能会追踪问题。
  • 这仍然是太多的代码,社区没有时间浏览它。请记住,我们是在自愿奉献我们的时间,而我们要求的回报是您为自己付出一些努力。请花一些时间在调试器中,将问题缩小到不超过 20 行,然后如果您仍然需要帮助,请返回这 20 行。

标签: java events listener keylistener keyevent


【解决方案1】:

没有显示 main() 方法,我们所说的一切都只是猜测。但是一个问题是你的 run() 方法是一个阻塞事件线程的无限循环。

【讨论】:

  • 这并不是问题的真正答案。如果您需要澄清,请改为发表评论。
猜你喜欢
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 2016-11-29
相关资源
最近更新 更多