![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
あるアプリケーション内で、時間のかかる処理の間、進行状況を表すためにJProgressBarを使用したのですが、処理の間、JProgressBarは動かず0%のままで、時間のかかる処理が終了すると同時に、JProgressBarは100%になり終了します。これでは、進行状況が報告されず無意味になってしまうのですが、どうやったら進行状況が表示されるのでしょうか?
分かる方御教授お願いします。
このリンク先のプログラムをJProgressBar表示に利用しています。
http://wisdom.sakura.ne.jp/system/java/swing/swi …
また、ソースは、
...
PThread pt = new PThread();
pt.start();
/*
長い処理の部分
*/
finishExe = true; // Thredに処理終了を告げる
...
class PThread extends Thread{
public void run(){
try{
ActionProgressBar jb = new ActionProgressBar();
while(!finishExe){ /* 長い処理が終わるまで繰り返し */
jb.progressBar.paintImmediately(jb.progressBar.getVisibleRect());
super.sleep(1000);
}
jb.stop(); /* 処理終了 */
jb.dispose();
finishExe = false;
}
catch(Exception err){
}
}
}
No.3ベストアンサー
- 回答日時:
#2のお礼欄にあるActionProgressBar()は100ms毎にvalueを1インクリメントするプログレスバーですので、ご質問欄の「長い処理の部分」に全く依存しません。
さらに、設定されているプログレスバーのMAXが100000ですから、100000/(1/0.1) = 10000 sec つまり3時間くらいまたないと100%になりません。
そこで「長い処理部分」のうち何パーセントの処理が終わったのかをプログレスバーに通知する必要があります。
例えば下のように。
public class ActionProgressBar extends JFrame {
private JProgressBar progressBar;
private int value;
public ActionProgressBar() {
super();
getContentPane().setLayout(new FlowLayout());
progressBar = new JProgressBar(0 , 100);
progressBar.setStringPainted(true);
getContentPane().setLayout(new FlowLayout());
getContentPane().add(progressBar);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("JProgressBarTest");
setSize(200, 100);
setVisible(true);
}
public void stop(){
try {
progressBar.setValue(100);
Thread.sleep(3000);
} catch (InterruptedException e) {e.printStackTrace();}
System.exit(0);
}
public void setValue(double value) {
progressBar.setValue( (int)(value * 100) );
}
public static void main(String[] args) {
ActionProgressBar apb = new ActionProgressBar();
// 時間のかかる処理 (例えば処理するファイル数が3000個の場合)
int file_count = 3000;
for (int i=1; i<=file_count; i++) {
// なんかのファイル処理
// ここではその処理に10ms時間がかかるとする.
try {
Thread.sleep(10);
System.out.println(i+"番目のファイルを処理しました");
apb.setValue((double)i/file_count); // 3000個のファイル中i個のファイルを処理したことを報告
} catch (Exception e){}
}
apb.stop(); //処理終了
System.exit(0);
}
}
もし処理時間を予測できないようなものであれば、
http://www-06.ibm.com/jp/developerworks/java/031 …
のように不確定モードをonにして使う対処等が考えられます。
No.2
- 回答日時:
すでにNo.1さんがおっしゃっていますので、あれですが・・・・
JProgressBarですよね?
最初にmin値とmax値を設定しておき、現在値を都度setValue(int n)してあげる
必要があるとおもいますが、
そのあたりは、正しく設定されていますか?
あとは、setStringPainted(boolean b) でしょうか。
おくれまくりました。ごめんなさい(>_<)
この回答への補足
補足がおくれて申し訳ありません。
使用しているのは、JProgressBarです。
以下、使用しているソース部分。
コンストラクタの箇所でMaxおよびMinは設定しているし、ActionperformedでsetValueもしています。
setStringPainted(boolean b)なのかは、分かりません。デフォールトの設定のままです。
public class ActionProgressBar extends JFrame implements ActionListener {
Timer timer;
JProgressBar progressBar;
int value;
ActionProgressBar() {
getContentPane().setLayout(new FlowLayout());
progressBar = new JProgressBar(0 , 100000);
progressBar.setStringPainted(true);
getContentPane().setLayout(new FlowLayout());
getContentPane().add(progressBar);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("JProgressBarTest");
setSize(200, 100);
setVisible(true);
timer = new Timer(100 , this);
timer.start();
}
public void stop(){
Thread th = new Thread();
if (value == 100000){
timer.stop();
progressBar.setValue(value);
try {
th.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.exit(0);
}
}
public void actionPerformed(ActionEvent e) {
Thread th = new Thread();
try {
th.sleep(2000);
value = progressBar.getValue();
progressBar.setValue(++value);
}
catch(Exception err){
}
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- その他(プログラミング・Web制作) VB.NETの正規表現について 4 2022/04/12 16:54
- Excel(エクセル) エクセルVBA マクロ処理中のポップアップメッセージについて 1 2023/08/04 21:34
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- 投資・株式の税金 確定申告に付いて 4 2022/05/12 01:54
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- デスクトップパソコン 「自動修復でPCを修復できませんでした」と表示されPCが起動しないのですが対処法はありますか? 5 2022/05/13 09:16
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ftp 同時複数接続の負荷テスト...
-
tryの終了
-
java正規表現で複数行を取得し...
-
onBlurとonFocusの処理順序につ...
-
このwhile文、ずっと回っている...
-
JavaScriptからJAVAクラスを呼...
-
iアプリJavaのスレッド処理
-
Tomcat高負荷時の設定について
-
Javaアプリケーション実行の返...
-
BLOB型の画像データを表示したい
-
ラベルの表示までが異常に遅い...
-
ブラウザを閉じた後のサーバ側...
-
数値の定数を付ける時
-
doGetとdoPostの違い
-
「タイプ初期化子が例外をスロ...
-
日本の教育って時間が無い中で...
-
エクセルVBAで、条件に一致する...
-
bmp画像をjpegやpng画像に圧縮...
-
private static という変数の修飾
-
変数名の付け方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tryの終了
-
doGetとdoPostの違い
-
JavaScriptからJAVAクラスを呼...
-
Javaでのデバッグコード削除
-
WPF C#でF10のイベント取得方法...
-
数値の定数を付ける時
-
Tomcat高負荷時の設定について
-
Javaプログラムからポップアッ...
-
JavaでVBのDOEVENTSと同様の処...
-
JSP、サーブレットの初期処理
-
ExcelVBA で文字列の特定の文字...
-
VBScriptでのWord印刷
-
ラジオボタンの選択判定
-
switch文の中に、throws new Ex...
-
ftp 同時複数接続の負荷テスト...
-
Javaアプリケーション実行の返...
-
C#で別スレッドの終了を知りたい
-
ブラウザを閉じた後のサーバ側...
-
[Java] while(true)の意味
-
flush()メソッドについて・・・
おすすめ情報