2017-04-22 1 views
0

NetBeansで簡単なGUIアプリケーションを開発しようとしています。長い方法の中からスイングGUIを更新するには(私はTextAreaをすぐに更新したいですか?)

私は、アプリケーションによって実行されている現在のアクションをTextAreaに書き込むために、何らかの種類のGUIログシステムを作成したいと考えています。

単純な例として、「開始」ボタンとTextAreaという2つのオブジェクトだけを含むJFrameフォームを作成しました。

「開始」ボタンを押すと、何らかの長いメソッドが呼び出されます。実行には時間がかかります(たとえば10秒)。このメソッドが実行されている間は、テキストをTextAreaはこの長いメソッドを使用しています(もちろん、TextAreaをすぐに更新したいと思います)。

私の問題は、私がそれを行う正しい方法を見つけることができないということです。とにかく私はこれをやってみました。「開始」ボタンを押すと、アプリケーションは10秒間フリーズし、必要なようにTextAreaを更新しません。メソッドが終了したときだけ、TextAreaへの更新が見えます。

private void startButtonActionPerformed(java.awt.event.ActionEvent evt) { 
try { 
    for (int i = 0; i < 10; i++) { 
     textArea.setText(i + "\n"); 
     Thread.sleep(1000); 
    } 
} catch (Exception e) {} 

}

+0

私はちょうど同じ問題を持っています – Yassine

答えて

0

リスナーでのThread.sleep(...)を使用しないでください。ここでは

は、サンプルコードです。すべてのリスナーコードはEvent Dispatch Thread (EDT)で実行されます。ループの実行が終了するまで、GUIは再描画できません。

解決策は、長時間実行するタスクに別のThreadを使用することです。これを行う1つの方法は、SwingWorkderを使用することです。コードが別のスレッドで実行されると、必要に応じてThread.sleep(...)を使用できます。

EDTSwingWorkerの詳細については、ConcurrencyのSwingチュートリアルのセクションを参照してください。このチュートリアルには、始めるための実例が含まれています。

+0

あなたはちょうどそのリルの例で私を助けてください...私はスイングワーカーの仕事を理解しようとしました – Yassine

+0

@ Yassine、チュートリアルを読んでください。 「中間結果を持つタスク」のセクションは、実際の例題を開始する場所かもしれません。作業用のサンプルをダウンロードし、必要な作業用のサンプルを変更してください。また、フォーラムでSwingWorkerを使用する他のサンプルを検索することもできます。私はあなたが混乱しているものを知りません。さらに助けが必要な場合は、あなたが試したことを示す適切な[mcve]を投稿してください。 – camickr

+0

お返事ありがとうございました^ -^ – Yassine

-1

私はあなたが新しいスレッドを作成し、そこに10秒のコードを実行する必要があると思います。そうでなければ、GUIは代わりにフリーズするでしょう

+0

(1-)答えはすでに与えられています。同じ提案を繰り返す必要はありません。 – camickr

+0

おっと、私はそれを見ていませんでした残念! @camickr –

関連する問題