2010-07-04 65 views
2

我不能更新我的進度......這是我的代碼更新的JProgressBar

Thread t=new Thread(new Runnable(){ 
     public void run(){ 
      int i=1; 
      jProgBar.setMinimum(0); 
      jProgBar.setMaximum(100); 
      try { 
       while(i<=100 || true){ 
        jProgBar.setValue(i); 
        i++; 
        Thread.sleep(50); 
       } 
      } 
      catch (InterruptedException ex){ 
       jProgBar.setValue(jProgBar.getMaximum()); 
      } 
     } 
    }); 
    t.start(); 

    .... Something code that correctly works 

    t.interrupt(); 

進度條狀態僅在線程結束時更新。 有人可以幫助我嗎?

回答

1

謝謝大家。 我解決了是的,這是根據這一原則,即對各部的狀態的任何變化應該從事件指派線程來完成這樣

try{ 
     jProgBar.setIndeterminate(true); 
     jProgBar.setStringPainted(true); 
     jProgBar.setBorderPainted(true); 
     new Thread(new Runnable() { 
      public void run() { 
       ... 
       // here is code that i've to wait 
       // after this i stop my jProgressBar 
       ... 
       jProgBar.setStringPainted(false); 
       jProgBar.setBorderPainted(true); 
       jProgBar.setIndeterminate(false); 
     } 
     }).start(); 
    } 
    catch(IllegalStateException ex){ 
     //some code 
    } 
4

在睡覺之前,向SwingUtilties.invokeLater()添加一個調用,該調用產生一個線程來觸發EDT中的進度條上的firePropertyChange。

+0

。 Swing顯然是以這種方式設計的(單線程)以避免太複雜。任何來自外部的呼叫都可能導致潛在的相互阻擋。我的理解是,invokeLater()將一個調用放置在某種執行隊列的末尾。 – 2010-07-04 13:48:22

3

使用而獲得的模型,而不是直接JProgressBar的:

DefaultBoundedRangeModel model = new DefaultBoundedRangeModel(); 
JProgressBar bar = new JProgressBar(model); 

// Somewhere else, perhaps in another Thread 
model.setValue(i) 

下面的示例正常工作:

public static void main(String[] args) throws InterruptedException { 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(200, 100); 
    frame.setVisible(true); 
    final DefaultBoundedRangeModel model = new DefaultBoundedRangeModel(); 
    frame.add(new JProgressBar(model)); 
    Thread t = new Thread(new Runnable() { 
     public void run() { 
      int i = 1; 
      model.setMinimum(0); 
      model.setMaximum(100); 
      try { 
       while (i <= 100 || true) { 
        model.setValue(i); 
        i++; 
        Thread.sleep(50); 
       } 
      } catch (InterruptedException ex) { 
       model.setValue(model.getMaximum()); 
      } 
     } 
    }); 
    t.start(); 

    Thread.sleep(2000); 

    t.interrupt(); 
} 
+2

除非他在美國東部時間這樣做,否則它不會起作用。 – 2010-07-04 18:57:37

+0

是的,它的工作原理。請參閱JDK1.6.0_20中的BasicProgressBarUI行1226-1229,該行發出repaint(),從而生成Toolkit.getEventQueue()。postEvent(e); – mhaller 2010-07-04 19:06:48

0

把這個片段

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     jProgBar.repaint(); 
    } 
} 

'我++' 和「的Thread.sleep之間( )'應該完成這項工作。爲了讓它編譯,將jProgBar標記爲'final'。