2016-08-05 3 views
1

多くのJProgressBarアップデート質問に追加することをお詫びしますが、これは本当に私を夢中にしています。JProgress BarがSwingWorker内で更新されない

私はJProgressBarをSwingWorker経由で更新していますが、まだ完了後にバーが更新されるという典型的な問題があります。問題が原因必要な場合、私はより多くのコードで私の質問を編集します別のセクションに可能性がある場合

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import java.util.ArrayList; 
import java.util.Calendar; 
import java.util.List; 
import java.util.concurrent.ExecutionException; 
import javax.swing.*; 

public class SwingTest { 

    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       init(); 
      } 
     }); 
    } 

    public static void init() { 
     JFrame frame = new JFrame(); 
     JPanel panel = new JPanel(); 
     JProgressBar bar = new JProgressBar(); 

     JButton button = new JButton("Start"); 
     button.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       bar.setMaximum(100); 
       bar.setValue(0); 

       SwingWorker worker = new SwingWorker<String, Void>() 
       { 
        @Override 
        public String doInBackground() 
        { 
         int val = 0; 
         // +1 to make inclusive 
         for (int i = 0; i < 100; i++) 
         { 
          try 
          { 
           Thread.sleep(50); 
          } catch (InterruptedException e) 
          { 
           e.printStackTrace(); 
          } 

          setProgress(++val); 
         } 

         return "Hello SwingWorker World"; 
        } 

        @Override 
        public void done() 
        { 
        } 
       }; 

       worker.addPropertyChangeListener(
         new PropertyChangeListener() 
         { 
          public void propertyChange(PropertyChangeEvent evt) 
          { 
           if ("progress".equals(evt.getPropertyName())) 
           { 
            bar.setValue((Integer)evt.getNewValue()); 
           } 
          } 
         } 
       ); 

       worker.execute(); 

       try 
       { 
        System.out.println("Return: " + worker.get().toString()); 
       } catch (InterruptedException e1) 
       { 
        e1.printStackTrace(); 
        System.out.println("Failed."); 
       } catch (ExecutionException e1) 
       { 
        e1.printStackTrace(); 
        System.out.println("Failed."); 
       } 
      } 
     }); 

     panel.add(button); 
     panel.add(bar); 

     frame.add(panel); 
     frame.pack(); 
     frame.setSize(200,90); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

:ここ

は、関連するコードです。

ありがとうございます。

編集:最小限の製品にコードを削除しました。

+0

ヘルプをもっと早く得るには、[MCVE]または[短く、自己完結型の正しい例](http://www.sscce.org/)を投稿してください。 –

答えて

0

投稿したコードの問題は、SwingWorkerを起動したときにすぐに実行されるのを待つことです。ディスプレイを防ぎ、このブロックイベントスレッドは、更新されている:あなたはそのtry-catchブロックの全体をコメントアウトした場合

worker.execute(); // This starts the thread in the background 

try 
{ 
    // This immediately stops the event handler waiting for the worker to finish 
    System.out.println("Return: " + worker.get().toString()); 
} catch (InterruptedException e1) 
{ 
    e1.printStackTrace(); 
    System.out.println("Failed."); 
} catch (ExecutionException e1) 
{ 
    e1.printStackTrace(); 
    System.out.println("Failed."); 
} 

、それが実行され、表示を更新します。

ワーカーの結果を待つ必要がある場合は、の別のスレッドの結果を待ってから、UIスレッドを続行する必要があります。

+0

それは素晴らしいです!ありがとうございました!だから、別のスレッドで結果を待つと、どうすれば親関数に戻すことができますか?私は想像しています。ウェイト()はEDTもブロックします。 –

+0

その解決策を見つけました。ちょうどいくつかのコードをリファクタリングする必要があった。再度、感謝します! –

1

まあ、私はあなたのコードが何をしているのか正確にはわかりませんが、私はあなたのコードのどこに "遅延"があるのか​​分かりません。

結果として、ループは実行を継続し、すべてのペイント要求が単一の要求に統合されるため、最終値のみが表示されます。

setProgress(...)メソッドの後にThread.sleep()を追加するだけで、これが問題であることを確認できます。

この場合、コードが非常に高速に実行されるので、なぜプログレスバーを使用しているのでしょうか。

How to Use Progress BarsのSwingチュートリアルのセクションを読み、作業デモから始めてください。作業コードを変更して、変更を加えたときに何が起こるかを確認することができます。

+0

自分のコードを編集して、最小限の表現にしました。完全なコードは、実行するのに数分から1時間以上かかることがあります。私があなたを理解しているとすれば、コードが非常に速く実行されているとは思いません。 –

関連する問題