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が true の場合、ループを終了する方法は 2 つしかないため、永久にループします。

  • inGameループ内で false に設定されます
  • これはbreakループ内のステートメントです

どちらもコードにはありません。


参考までに、コード パターンwhile(true)は、リクエストを待機している Web サービスなどに必要な無限ループを作成する一般的な方法です。

于 2012-12-31T23:11:45.990 に答える