-1

JLabel一時的に変更したい があります。そのために書いたコードは次のとおりです。

infoLabel.setText("Added");
try {
   TimeUnit.MILLISECONDS.sleep(300);
}
catch(InterruptedException ex)
{
}

infoLabel.setText("Action"); //funny part is when I comment this line it works

ラベルのデフォルトのテキストは「アクション」です

4

4 に答える 4

3

Swing はシングル スレッド フレームワークです。つまり、このスレッドを停止させるようなことをすると、ペイント リクエストを含む新しいイベントに応答できなくなります。

基本的にTimeUnit.MILLISECONDS.sleep(300)、イベント ディスパッチ スレッドがスリープ状態になり、新しい描画要求を処理できなくなります (とりわけ)。

代わりに、javax.swing.Timer

を見てみましょう

詳細については

例えば...

infoLabel.setText("Added");

Timer timer = new Timer(300, new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        infoLabel.setText("Action");
    }
});
timer.setRepeats(false);
timer.start();

300 ミリ秒は非常に短い時間であることに注意してください。2 秒である 2000 のように少し大きい値から開始することをお勧めします ;)

于 2013-10-28T02:20:03.657 に答える
1

GUI全体をスリープ状態にするSwingイベントスレッドをスリープ状態にしています。そうしないでください。代わりにスイングタイマーを使用してください。

于 2013-10-28T02:20:06.677 に答える
0

アプリケーションは単一のスレッドで実行されるため、スレッドをスリープ状態にすると、GUI の更新が行われなくなります。

于 2013-10-28T02:20:14.697 に答える
0

あなたは物事を適切に行っていると確信していますか?GUI スレッドですべて (スリープを含む) を実行することにより、常にビジー状態になり、GUI を再描画できるようにするために Java に戻ることはありません。

詳細については、EDT (イベント ディスパッチ スレッド) を検索してください。この件に関する 1 つの質問があります:コードの処理が機能しません (スレッド、draw()、noLoop()、および loop())

于 2013-10-28T02:21:13.617 に答える