2015-05-05 56 views
0

所有的編碼運行,我唯一的問題是進度條不顯示值的變化。我設置了這些值,但是如果我運行該值,則不會顯示在進度條上。 (酒吧沒有填滿)Java - 進度條沒有進展

public void logIn() { 
    try { 
     while (true) { 
      calculate(); 
      System.out.println(loadingProgress); 
      if (loadingProgress < 100) { 
       mGUI.pbLoading.setValue(loadingProgress); 
       Thread.sleep(random.nextInt(5000) + 100); 
      } else { 
       mGUI.pbLoading.setValue(100); 
       break; 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public void calculate() { 
    random = new Random(); 
    loadingProgress = loadingProgress + random.nextInt(9) + 1; 
} 
+1

似乎在這裏你阻止'EDT'。閱讀[Swing中的併發](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/),還需要使用['SwingWorker']](https://docs.oracle.com/javase/教程/ uiswing/concurrency/simple.html)長背景任務。檢查[示例](http://stackoverflow.com/a/15710912/2894369)。 – alex2410

+0

完全相同的情況我面臨(http://stackoverflow.com/questions/29727991/jprogressbar-does-not-update-within-the-loop)。 [這裏](http://stackoverflow.com/questions/29817219/changing-the-default-cursor-to-busy-cursor-does-not-work-as-expected)是固定的代碼。使用SwingWorker。 –

回答

0

計算必須在一個額外的線程中完成。這是因爲當前正在運行的線程阻塞了UI的重繪,直到計算完成。

+2

不,實際上,進度條需要在EDT上更新,否則就違反了api的單線程性質。工作需要在一個單獨的線程完成,以免阻止美國東部時間 – MadProgrammer

+0

是的,你是對的,我困惑,並會更新我的文章。 – derMrich

0

問題出在您的發佈代碼之外。我用你的代碼來創建一個工作示例:

package snippet; 

import java.util.Random; 

public class Snippet { 
    public class ValueAccepter { 

     public void setValue(int loadingProgress) { 
      System.out.println(loadingProgress); 
     } 

    } 

    public class MGUI { 

     public final ValueAccepter pbLoading = new ValueAccepter(); 

    } 

    private int loadingProgress; 
    private Random random; 
    private MGUI mGUI = new MGUI(); 

    public static void main(String[] args) { 
     new Snippet().logIn(); 
    } 

    public void logIn() { 
     try { 
      while (true) { 
       calculate(); 
       System.out.println(loadingProgress); 
       if (loadingProgress < 100) { 
        mGUI.pbLoading.setValue(loadingProgress); 
        Thread.sleep(random.nextInt(5000) + 100); 
       } else { 
        mGUI.pbLoading.setValue(100); 
        break; 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void calculate() { 
     random = new Random(); 
     loadingProgress = loadingProgress + random.nextInt(9) + 1; 
    } 
} 

我認爲你的擺動線程有問題。確保mGUI.pbLoading.setValue按預期返回。

+0

不,它不是。登錄方法在EDT的上下文中執行,因爲您的不是,違反了Swing的單線程規則 – MadProgrammer

+0

@MadProgrammer如果'pbLoading'是一個Swing組件,那麼您是對的。在我的例子中,pbLoading不是一個Swing組件 - 並且一切正常。如果我們有更多的弗朗索瓦代碼,我們可以判斷線程規則是否被違反。 – slartidan

0

您必須使用SwingWorker來執行圖形用戶界面操作和計算,否則event dispatch thread將無法​​重繪。 Here是一個進度條演示代碼Oracle

+0

你不「有」,但它可能是首選的方法。但是如果我是那個人,我會問爲什麼?你還沒有解釋 – MadProgrammer