私はJavaとスレッド全般に不慣れで、Javaで次のGUIアプリケーションを持っています:
フレーム内で、ユーザーが任意の場所でマウスをクリックすると、画像が表示されます。
画像が表示されると、リアルタイム タイマーの実行が開始され、
jLabel
ユーザーが GUI で選択した値に応じて、タイマーが最大 5 秒まで更新されます。同時にサウンドクリップが再生されます。画像と音が一致すると、ユーザーはクリックしてタイマーを停止します。一致または不一致を反映するために、いくつかの jLabel 値が更新されます。そうでない場合、ユーザーはアイドル状態になり、タイマーが切れた後にイメージ/サウンド クリップのペアが変更されるのを待ちます。ユーザーがタイマーを停止するかタイマーが切れると、アプリケーションは事前に選択された画像間の時間間隔の値を待機し、次の画像/サウンド値に進みます。
私は次の構造を持っています:
電話する
while(true)
{
SwingUtilities.invokeAndWait(displayTimer);
}
私のrun()
方法で。
私のRunnable
は
private final Runnable displayTimer= new Runnable()
{
public void run()
{
displayElapsed(System.currentTimeMillis() - startTime);
}
};
後でstartTime
初期化され、タスクの開始の開始基準点になります。
私のdisplayElapsed()
方法は面倒で、タイマーがユーザー入力または非アクティブによって停止したかどうかを確認します。そうでない場合は、jLabel
タイマーの責任者を更新します。存在する場合は、startInteraction()
メソッドを呼び出します。
startInteraction()
新しい画像と音声を用意し、それぞれを表示・再生し、新しいスレッドupdater
を作成して起動します。
mouseListener
ユーザー入力をリッスンするもあります。ユーザーがクリックすると呼び出さupdater.interrupt()
れます。
では、質問です。私は、スイングがスレッドセーフでないことを知っています。ユーザーのマウスクリックにすぐに応答しないこともあれば、適切な待ち時間なしで 2 つの画像/音声のペアを通過することもあるため、動作には間違いなく問題があります。ラベルもすぐには更新されません。
一般的に、構造はごちゃごちゃしているように見えますが、論理的に説明することはできません。
私が知っているのは、displayElapsed
私が行うたびに新しいスレッドを開始し、ユーザーまたはアイドルストップがあるたびに中断することだけです。したがって、技術的には、各スレッドは順番に並んでいる必要があります。
これを行うにはもっと良い方法が必要であり、これを書き直す上で何が良いスタートになるかを知りたかったのです。