私は Swing の初心者で、現在 NetBeans で簡単な GUI アプリケーションを開発しようとしています。
アプリケーションによって実行されている現在のアクションを 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) {}
}
この例では、ボタンをクリックすると、次の 10 秒間、次のように TextArea に新しい行が 1 秒ごとに追加されることが期待されます。
1
2
3
4
...
しかし、このコードから得られる実際の結果は、アプリケーションが 10 秒間フリーズし、最終的に TextArea が更新され、数字の 9 だけが表示されるということです。
主にSwingUtilities.invokeLaterおよびSwingWorkerメソッドを使用して、これを正しく行うためのさまざまな方法を試しましたが、どれもうまくいきませんでした。
それを行う正しい方法を見つけるための助けをいただければ幸いです。