2013-10-30 74 views
1

下面的函數被調用來移動進度條,但我不知道爲什麼它不會移動,直到其他進程正常工作。爲什麼進度條沒有進展?

private void startProgressBar() { 
    signInProgressBar.setMinimum(0); 
    signInProgressBar.setMaximum(10); 
    Runnable r = new Runnable() { 
     @Override 
     public void run() { 
      int p = 1; 
      while(!loginCompleted) { 
       signInProgressBar.setValue(p); 
       //System.out.println(p); 
       p++; 
       try {Thread.sleep(5000);}catch(Exception exc) {} 
      }      
     } 
    }; 
    new Thread(r,"progress_bar_thread").start(); 
} 

片段調用startProgressBar

 startProgressBar(); // CALL 
     String username = usernameTextField.getText(); 
     String password = new String(passwordField.getPassword()); 
     Openfire server = new Openfire(); 
     boolean isConnected = server.connect(username,password); 
     if(isConnected) { 
      // Stash the username and password 
      User user = new User(); 
      user.setUsername(username); 
      user.setPassword(password); 

      // Stop the progress bar 
      loginCompleted = true; 

      // Display the next window 
      UserGUI blab = new UserGUI(); 
      blab.setVisible(true); 
      this.dispose(); // Dispose off the login window 
     } 

可能是什麼問題呢?

+0

難道這是問題signInProgressBar.setValue(5)在Runnable的運行方法? –

回答

1

所有的這些東西:

Openfire server = new Openfire(); 
    boolean isConnected = server.connect(username,password); 
    if(isConnected) { 
     // Stash the username and password 
     User user = new User(); 
     user.setUsername(username); 
     user.setPassword(password); 

     // Stop the progress bar 
     loginCompleted = true; 
     // .... 

...應該在後臺線程來完成,特別是連接並與服務器進行交互,否則你會被佔用了Swing事件線程,並用它你整個GUI。還可以爲後臺線程使用SwingWorker,並設置JProgressBar通過PropertyChangeListener輕鬆遵循的值。

-2

您可能需要repaintinvalidate

嘗試

signInProgressBar.invalidate(); 
signInProgressBar.repaint(); 

,爲什麼你對signInProgressBar.setValue

+0

這種情況從來不需要。當容器添加或刪除組件時,這些方法是必需的,而不是在調整JProgressBar的值時。 –

2

設置始終5您的代碼不會出現在所有調整進度條:

signInProgressBar.setValue(5); // <-- in your while loop 

這只是不斷地設置酒吧的位置爲5,這似乎是您的規模的50%左右。也許如果你不確定任務的長度,你應該讓你的進度條indeterminate

您還應該使用EDT來調整進度條setValue()。有關更多詳細信息,請參閱Concurrency in Swing tutorial

+0

這是錯誤的..我已經刪除了語句,將值設置爲5 – saplingPro

+0

@saplingPro我指的是'while'循環中的語句。 –

+0

@空手不夠公平,我錯誤地鍵入了「滾動條」。 :-) –

0
while(!loginCompleted) { 
      signInProgressBar.setValue(5); 
      //System.out.println(p); 
      p++; 
      try {Thread.sleep(5000);}catch(Exception exc) {} 
     } 

您犯了一個小錯誤signInProgressBar.setValue(5);應該是ignInProgressBar.setValue(p);

當前代碼開始時會生成一個空欄,然後immidieatly將其設置爲50%,沒有任何語句可以在登錄完成後繼續執行它。

+0

看到編輯....我刪除了'signInProgressBar.setValue(5);' – saplingPro