あるアプリケーション内で、時間のかかる処理の間、進行状況を表すために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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
tryの終了
-
無限ループをわざと作って時計...
-
C#の処理をリアルタイムに表示...
-
doGetとdoPostの違い
-
C#でバックグラウンド処理から...
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
オブジェクトレベルとメタレベル
-
変数名の付け方
-
エクセルVBA 画像を貼り付ける...
-
配列の重複する値とその個数を...
-
インスタンス参照でアクセスで...
-
VB.NET getとsetの概念がわかり...
-
成人式の後中3のクラスで集まろ...
-
C# インスタンスの破棄
-
【sendkeysメソッドが動かずに...
-
「インスタンス」の意味をわか...
-
関数内の変数に<summary>コメン...
-
Excelで =EMBED("Acrobat Docu...
-
String型からlong型への変換は...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tryの終了
-
Tomcat高負荷時の設定について
-
アコーディオンメニューをアン...
-
[Java] while(true)の意味
-
JavaScriptからJAVAクラスを呼...
-
Javaでのデバッグコード削除
-
doGetとdoPostの違い
-
SwingUtilities.invokeLater(ne...
-
数値の定数を付ける時
-
JavaでVBのDOEVENTSと同様の処...
-
onBlurとonFocusの処理順序につ...
-
JSP、サーブレットの初期処理
-
JAVAにおける画像のJPEG保存の...
-
ftp 同時複数接続の負荷テスト...
-
Javaアプリケーション実行の返...
-
Javaプログラムからポップアッ...
-
データ未入力時のエラー処理が...
-
JDBCでテーブルUPDATE後の再検...
-
ExcelVBA で文字列の特定の文字...
-
ラジオボタンの選択判定
おすすめ情報