2

我开始玩别人的代码并遇到了一个有趣的实验。该程序将与 if 语句一起正常工作。但是我发现如果我将 if 语句更改为 while 循环,程序会运行,但我无法使用 X 按钮关闭程序,而是必须按下 Eclipse 终止按钮。我猜这是一个无限循环的迹象,还是 Java 不能一遍又一遍地重复绘制相同的图像的事实?

// if you want to draw graphics on the screen, use the paintComponent method
        // it give you a graphic context to draw on
        public void paintComponent(Graphics g){

            super.paintComponent(g);

            // when the player is still in the game
            if(inGame){
                g.drawImage(apple, apple_x, apple_y, this);

                for (int z = 0; z < dots; z++) {
                    if (z == 0)
                        g.drawImage(head, collisionX[z], collisionY[z], this);
                    else g.drawImage(tail, collisionX[z], collisionY[z], this);
                }
                Toolkit.getDefaultToolkit().sync();

                // dispose graphics and redraw new one
                g.dispose();
            }
            else gameOver(g);
        }
4

3 回答 3

5

将此行更改为while语句

if (inGame) {

将不允许将变量重置为false,从而导致无限循环。一般来说,使用while 循环或任何资源密集型调用paintComponent是一个坏主意。Swing 具有处理这些的并发机制。

于 2012-12-31T23:11:52.153 回答
4

如果您希望您的 UI 保持响应,事件处理程序和重绘应该在合理的时间内完成。这意味着你根本不应该在里面循环paintComponent();相反,您必须从其他地方反复触发重绘,例如动画计时器。

于 2012-12-31T23:16:56.607 回答
2

将 更改if为 a while,即:

while(inGame){

如果为真,将永远循环inGame,因为只有两种方法可以退出循环:

  • inGame在循环内设置为 false
  • break是循环中的一个语句

在代码中都没有找到。


仅供参考,代码模式while(true)是创建无限循环的常用方法,这对于等待请求的 Web 服务之类的事情是必需的

于 2012-12-31T23:11:45.990 回答