私はJavaクラスで最終プロジェクト用のブラックジャックプログラムを作成しています。ラウンドの最後に自分のカードを与えるディーラーをシミュレートしたいと思います。私はちょっと休憩を見せるために1秒間whileループの各繰り返しを眠りたい。以下は、私がスタックオーバーフローで読んだ異なるスレッドに基づいて取った2つの試みですが、どちらも動作しません。JavaFX新しいラベルを表示してループの各繰り返しをスリープします
Timeline timeline = new Timeline(
new KeyFrame(Duration.millis(1000), event ->
{
if(dealer.getScore() < 17 || (dealer.getScore() < player.getScore() && dealer.getScore() <= 21))
{
newCard(dealer, mainDeck.deal(), false);
System.out.println("Running Here!");
LBLDeck.setText(String.valueOf(mainDeck.getRemaingCards()) + " cards remaining");
}
})
);
timeline.setCycleCount(1);
System.out.println("Starting loop!");
と、この1:
while (dealer.getScore() < 17 || (dealer.getScore() < player.getScore() && dealer.getScore() <= 21))
{
new Thread(() ->
{
try
{
Thread.sleep(1000);
newCard(dealer, mainDeck.deal(), false);
LBLDeck.setText(String.valueOf(mainDeck.getRemaingCards()) + " cards remaining");
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}).run();
}
私は私が前にタイムラインで働いたことがないので、最初の例と間違っているものをあまりにもわかりません。第2の方法としては、睡眠時間の合計を数え、その時間の間私のプログラムを凍結するように見える。 I.ループが3回行った場合、私のプログラムは3秒間スリープ状態になります。次に、すべてのラベルを一度に吐き出します。
何度も言われていますが、私はもう一度言っています。 JavaFXアプリケーションで 'Thread.sleep'を使わないでください。それはUI全体を停止させ、私はかなり確信しています、それはあなたが望むものではありません。 –
@ChandlerBingそれでは、代わりに何を使うべきですか?私はそれが起こっていることを理解していますが、別の解決策が必要なので投稿しています – Noah
@ChandlerBing "JavaFXアプリケーションで' Thread.sleep'を使わないでください。 "というのは本当に正しいわけではありません:' Thread.sleep '(または他のブロッキング呼び出し)*をJavaFXアプリケーションスレッド*上に作成します。 OPがここで何をしようとしているのか(バックグラウンドで 'start()'の代わりに 'run()'を呼んでいる)バックグラウンドスレッドで行うのは良いことです。 –