Java:While循环抑制JFrame的绘制功能

时间:2018-10-02 12:27:32

标签: java multithreading while-loop jframe keylistener

我正在为地牢爬行者构建自定义引擎。我有一个可以正常工作的KeyLogger,可以使用KeyListener来检测击键。

我在引擎内还有一个JFrame c和一个函数paint(),该函数生成框架并告诉c repaint()。第三,我有一个move()函数,可以根据按下的键更改玩家的坐标。

KeyListener:

KeyListener kl = new KeyListener() {

    @Override
    public void keyPressed(KeyEvent k) {

        if (k.getKeyChar() == 'w') {
            my = 1;
        } else if (k.getKeyChar() == 's') {
            my = -1;
        }

        if (k.getKeyChar() == 'a') {
            mx = 1;
        } else if (k.getKeyChar() == 'd') {
            mx = -1;
        }

    }

    @Override
    public void keyReleased(KeyEvent k) {

        if (k.getKeyChar() == 'w' || k.getKeyChar() == 's') {
            my = 0;
        }

        if (k.getKeyChar() == 'a' || k.getKeyChar() == 'd') {
            mx = 0;
        }
    }

};

move():

void move() {

    System.out.println("Moving by x: " + mx + " y: " + my);
    player.move(10 * mx, 10 * my);
    paint();

}

和paint()函数:

public void paint() {


    System.out.println("Paint Engine");

    Graphics g = Frame.getGraphics();

    //Generate Frame

    c.repaint();


}

运行所有这些的类称为安装程序:

public void setup() {

    LevelGen lg = new LevelGen();
    c.addKeyListener(kl);

    lg.generateLevel(0);

    walls = lg.getWalls();
    player = lg.getPlayer();

    paint(); // does not get executed with the while-loop but without

    while(true){ //Please sebd help
        move();
        paint();

        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

如果我将move()和paint()命令放在KeyListener或类的主函数中,则所有内容都可以像超级按钮一样工作,但是如果将它放入了while(true)循环中,或者在主函数中,或者在新函数中不会检测到KeyStrokes的线程,也不会执行循环/线程的最前面的paint()命令。

我也曾尝试删除Thread.sleep,但这绝对不会改变。快速说明:以任何方式添加循环时,Alt + F4也会停止工作。

在过去的6 1/2个小时里,我一直在解决这个问题,所以我可能很快就会发疯了。

0 个答案:

没有答案