進捗状況を表示しようと、JProgressBarをJFrameに貼り付けてみたのですが、
単体では表示出来るのに、開発中のソフトに組み込むとFrameは表示されるのに、中身が透明で何も表示されないという事象が発生します。
この件、心当たりある方ご教授願います。
ソースについてはコメント欄に記述させて頂きます。
コメントを読むと問題が切り分けできたみたいですね。
"時間のかかる処理"をコメントアウトしてみた場合、正常に進捗バーが表示されました。
ちなみに"時間のかかる処理"はhttp通信による情報取得です。
とのことなので、今回の事象は「JProgressBar の使い方の問題ではなく、Java のスレッドの使い方の問題」です。
ちゃんと理解したいならスレッドに関して検索して欲しいんですけど、とりあえず、
http://d.hatena.ne.jp/gsf_zero1/20061124
を挙げておきます。http通信による情報取得で JProgressBar を使うサンプルがあります(JProgressBar というよりは SwingWorker を用いたスレッド処理の解説といった方が良いかもしれないです)。
コメント(3件)
これとは別にメインフレームも表示していますので、それが邪魔してるのか?
Panelを使っていないからかな?
両者とも検証した結果関係なさそうでした。
int end = 234;
JProgressBar bar = new JProgressBar(0, end); // 最小、最大
bar.setPreferredSize(new Dimension(100, 40)); // バーのサイズ
bar.setStringPainted(true); // パーセンテージ表示
bar.setValue(0); // 初期値は0
JFrame frame = new JFrame();
// frame.setUndecorated(true);
frame.add(bar);
frame.setBounds(100, 100, 200, 70);
frame.setVisible(true);
// 実処理
for(int i = 0; i < end; i++) {
bar.setValue(i); // 進捗状況の更新
bar.repaint();
// 時間のかかる処理のテスト
try {
Thread.sleep(100); //ミリ秒単位で設定
} catch (InterruptedException e) {
System.out.println(e);
}
}
frame.removeAll();
frame.dispose(); // ダイアログを閉じる
> 開発中のソフトに組み込む
とき、時間のかかる処理は行わないで、bar.setValue(50) とか固定値でも表示出来ますか?
もし、表示出来ているのなら少なくともレイアウト上の問題ではないですね。
【検証1】
以下の2行をコメントアウトし。
bar.removeAll();
bar.dispose();
for文内に以下を記述してテストしてみました。
bar.setValue(50)
結果、まず今まで通りフレームのみが表示され、その後
"時間のかかる処理"が終わったタイミングで進捗バーが表示されました。
つまり溜まっていたジョブが一気に実行された感じでした。
即時描画する為にpaintImmediately()メソッドを使ってみましたが駄目でした。
【検証2】
"時間のかかる処理"をコメントアウトしてみた場合、正常に進捗バーが表示されました。
ちなみに"時間のかかる処理"はhttp通信による情報取得です。