0

スイングのワンクリックボタンでjlabel.textを数回変更する必要があります。このコードでは、ラベルテキストをdowork()関数の前に開始し、途中で進行中に設定し、dowork()の後に終了するように設定する必要があります(jlabelとdoworkのステータスタイプは長時間実行されます):

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
        status.setText("start");
        try {
            Thread.sleep(10000);
        } catch (InterruptedException ex) {
            Logger.getLogger(PelakInRFID.class.getName()).log(Level.SEVERE, null, ex);
        }
        status.setText("in progress");
        dowork();
       try {
            Thread.sleep(10000);
        } catch (InterruptedException ex) {
            Logger.getLogger(PelakInRFID.class.getName()).log(Level.SEVERE, null, ex);
        }
        status.setText("end");

 }

このコードでは、終了と開始にのみ設定されたステータスは表示されません。

4

2 に答える 2

2

決して、決して使用Thread.sleepしないThead.yieldでくださいETD

決して、ETD拡張IOやデータ処理などのブロッキングアクションを実行しないでください

ラベルが変更されない理由は、をストール/ブロックしているためETD、再ペイント要求を処理できないためです。

Swingイベントディスパッチスレッドの同時実行性を確認してください

于 2012-07-25T20:04:27.933 に答える
2

SwingWorkerインスタンス(特にそのメソッド)を使用して、メインUIスレッドとは異なるスレッドでdoInBackground現在実行していることを実行しようとします。doWork記述方法では、リスナーメソッドは実行中にユーザーインターフェイスをフリーズすることになります。これは、あなたが言ったように、長い時間がかかり、ユーザーエクスペリエンスが低下する可能性があります。

テキストへの変更は、3つの異なる場所で発生する可能性があります。最初に、 ;を呼び出す(つまり開始する)JLabel直前。次に、ユーザーインターフェイスで中間結果を公開できるようにする/メカニズムを使用します。3つ目は、メソッドで、メソッドの実行が終了するとすぐにUIスレッドで再度呼び出されます。executeSwingWorkerpublishprocessSwingWorkerdoneSwingWorkerdoInBackground

参照:ワーカースレッドSwingWorkerに関するOracleのチュートリアル、およびクラスのJavaDocAPIドキュメントSwingWorker

于 2012-07-25T20:05:19.327 に答える