3

while ループを再開しようとしています。ブール型の変数 keepGoing を宣言しました。int 変数 x がウィンドウから外れている場合、keepGoing は false に変更されます。次に、reset() メソッドは keepGoing=true にする必要があります。動作しますが、while ループが動作しません。

reset() と checkWin() を持つクラス:

private void reset() {
    b.x = 250;
    b.y = 100;
    b.keepRunning = true;
    a.keepGoing = true;
    System.out.println(a.keepGoing);
}

public void checkWin() {
    if (b.keepRunning) {
        if (b.getX() < -10) {
            a.score++;

            JOptionPane.showMessageDialog(okno, "Player " + p.getScore()
                    + " - Computer " + a.getScore(), "Oh, well...",
                    JOptionPane.INFORMATION_MESSAGE);
            b.keepRunning = false;
            a.keepGoing = false;
            System.out.println(a.keepGoing);
            reset();
        } else if (b.getX() > 599) {
            p.score++;
            JOptionPane.showMessageDialog(okno, "Player " + p.getScore()
                    + " - Computer " + a.getScore(), "Good!",
                    JOptionPane.INFORMATION_MESSAGE);
            b.keepRunning = false;
            a.keepGoing = false;
            System.out.println(a.keepGoing);
            reset();
        }
    }
}

スレッド、keepGoing、および while ループを含む 2 番目のクラス:

Runnable intel = new Runnable() {
    public void run() {
        while (keepGoing) {
            while (getY() < board.ball.getY()) {
                System.out.println(keepGoing + " " + getY());
                try {
                    if (y == 220) {
                    } else {
                        y += 1;
                        Thread.sleep(10);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            while (getY() > board.ball.getY()) {
                System.out.println(keepGoing + " " + getY());
                try {
                    if (y == 0) {
                    } else {
                        y -= 1;
                        Thread.sleep(10);
                    }
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
};
4

2 に答える 2

11

キーワードcontinueを使用して、ループの次の繰り返しに進みます。例えば:

while(true)
{
   // ...

   if(!condition) continue; // this will go to the beginning of the while loop.

   // ...
}
于 2012-07-11T16:47:12.993 に答える
1

フラグが異なるスレッドからアクセスされる場合keepGoing(あなたの例が示していると思いますが、明確ではありません)、同期を使用keepGoingして、 reset() メソッドでフラグを更新するときに、そのフラグがスレッドに表示されるようにする必要があります。あなたの実行可能。AtomicBooleanクラスをチェックアウトすることもできます。

有効な Java の項目 #66 を参照してください。

于 2012-07-11T16:54:53.423 に答える