2013-10-30 76 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