• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ProgressBarが0%から動きません)

ProgressBarが0%から動かない問題の解決方法

このQ&Aのポイント
  • 時間のかかる処理の間、JProgressBarが0%のままで動かない問題の解決方法を教えてください。
  • 進行状況が報告されず無意味になってしまう問題を解決するために、JProgressBarをどのように設定すれば良いですか?
  • リンク先のプログラムを参考にして、JProgressBarの表示を利用していますが、0%のままで動かない問題が発生しています。どのように修正すれば良いでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答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/031212/j_j-mer11183.html#N10118 のように不確定モードをonにして使う対処等が考えられます。

marucha
質問者

お礼

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

その他の回答 (2)

  • PED02744
  • ベストアンサー率40% (157/390)
回答No.2

すでにNo.1さんがおっしゃっていますので、あれですが・・・・ JProgressBarですよね? 最初にmin値とmax値を設定しておき、現在値を都度setValue(int n)してあげる 必要があるとおもいますが、 そのあたりは、正しく設定されていますか? あとは、setStringPainted(boolean b) でしょうか。 おくれまくりました。ごめんなさい(>_<)

marucha
質問者

補足

補足がおくれて申し訳ありません。 使用しているのは、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){ } } }

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.1

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

関連するQ&A