0

いくつかのファイルを Windows 共有にアップロードする簡単なプログラムを作成しようとしています。基本的な機能はすべて備えていますが、最後の仕上げに問題があります。GUI があり、アップロードに関する情報 (進行状況バーとラベル) を表示したいだけです。コードは次のとおりです。

private void btn_UploadActionPerformed(java.awt.event.ActionEvent evt) {

    upl.setFiles(files);

    for(int i = 0; i < files.length; i++){
        progressLabel.setText("Uploading " + files[i].getName());
        upl.uploadFile(i);
        uploadProgress.setValue(uploadProgress.getValue() + 90/files.length);

    }

    uploadProgress.setValue(100);

}

これは、ユーザーが [アップロード] ボタンを押すと実行されます。問題は、setText と setValue が本来の機能を果たさないことです。アップロード ボタンを押すと、アップロードが開始 (および終了) しますが、ラベルのテキストは変更されず、プログレス バーも変更されません。アップロードが完了したときにのみ変更されます。

ソースコード全体はここにあります: Code

助言がありますか?PSではJavaでかなり新しい:)

4

2 に答える 2

4

イベントディスパッチスレッドでアップロードを行っています。そのため、同じスレッドで実行されるペイント コードは、アップロードが完了するまで実行できません。イベント処理コードは、できるだけ早く終了する必要があります。実行するタスクが長い場合は、別のバックグラウンド スレッドで実行する必要があります。

SwingWorker を使用して、必要なことを行います。その javadocには、わかりやすい例があります。

于 2011-12-31T13:59:35.613 に答える
3

I second JB Nizet ,場合によっては、イベント ディスパッチ スレッドの代わりにバックグラウンド スレッドを使用すると、タスクの実行中にユーザー インターフェイスがフリーズするのを防ぐことができます。

参考までに、Javaチュートリアルから、

Swing プログラマーは、次の種類のスレッドを扱います。

  • 初期スレッド、初期アプリケーション コードを実行するスレッド。

  • すべてのイベント処理コードが実行されるイベント ディスパッチ スレッド。Swing フレームワークとやり取りするほとんどのコードも、このスレッドで実行する必要があります。

  • 時間のかかるバックグラウンド タスクが実行される、バックグラウンド スレッドとも呼ばれるワーカー スレッド。
于 2011-12-31T14:07:19.907 に答える