Swingでアプリケーションを開発しています。

進捗状況を表示しようと、JProgressBarをJFrameに貼り付けてみたのですが、
単体では表示出来るのに、開発中のソフトに組み込むとFrameは表示されるのに、中身が透明で何も表示されないという事象が発生します。

この件、心当たりある方ご教授願います。

ソースについてはコメント欄に記述させて頂きます。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/11/21 13:15:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:tsukasa57 No.1

回答回数110ベストアンサー獲得回数20

ポイント10pt

コメントを読むと問題が切り分けできたみたいですね。

"時間のかかる処理"をコメントアウトしてみた場合、正常に進捗バーが表示されました。

ちなみに"時間のかかる処理"はhttp通信による情報取得です。

とのことなので、今回の事象は「JProgressBar の使い方の問題ではなく、Java のスレッドの使い方の問題」です。

ちゃんと理解したいならスレッドに関して検索して欲しいんですけど、とりあえず、

http://d.hatena.ne.jp/gsf_zero1/20061124

を挙げておきます。http通信による情報取得で JProgressBar を使うサンプルがあります(JProgressBar というよりは SwingWorker を用いたスレッド処理の解説といった方が良いかもしれないです)。

  • id:pikab1
    単体で動かしたソースはこちらです。
    これとは別にメインフレームも表示していますので、それが邪魔してるのか?
    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(); // ダイアログを閉じる
  • id:tsukasa57
    色々と理由が考えられるのですが、もしかすると JProgressBar の使い方の問題ではなく、Java のスレッドの使い方の問題なのかもしれません。あるいは、レイアウト上の問題かも。

    > 開発中のソフトに組み込む

    とき、時間のかかる処理は行わないで、bar.setValue(50) とか固定値でも表示出来ますか?

    もし、表示出来ているのなら少なくともレイアウト上の問題ではないですね。
  • id:pikab1
    少し切り分けが出来たので報告いたします。

    【検証1】
    以下の2行をコメントアウトし。
    bar.removeAll();
    bar.dispose();

    for文内に以下を記述してテストしてみました。
    bar.setValue(50)


    結果、まず今まで通りフレームのみが表示され、その後
    "時間のかかる処理"が終わったタイミングで進捗バーが表示されました。

    つまり溜まっていたジョブが一気に実行された感じでした。

    即時描画する為にpaintImmediately()メソッドを使ってみましたが駄目でした。

    【検証2】
    "時間のかかる処理"をコメントアウトしてみた場合、正常に進捗バーが表示されました。

    ちなみに"時間のかかる処理"はhttp通信による情報取得です。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません