電子書籍の厳選無料作品が豊富!

あるアプリケーション内で、時間のかかる処理の間、進行状況を表すために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){
   }
  }
}

A 回答 (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にして使う対処等が考えられます。
    • good
    • 0
この回答へのお礼

詳しい解説ありがとうございます。
後ほど試してみたいと思います。

お礼日時:2006/12/09 11:53

すでに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){

}
}
}

補足日時:2006/12/08 11:36
    • good
    • 0

このソースだけでは判断できませんが、プログレスバーの現在値はちゃんと設定してますか?

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!