调用以下函数来移动进度条,但我不知道为什么它不移动直到其他进程正常工作。
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 :(得分:2)
您的代码似乎根本无法调整进度条:
signInProgressBar.setValue(5); // <-- in your while loop
这只是将栏的位置不断设置为5
,这在您的比例上似乎约为50%。也许如果您不确定任务的长度,您应该设置进度条indeterminate?
您还应该使用EDT通过setValue()
调整进度条。有关详细信息,请参阅Concurrency in Swing tutorial。
答案 1 :(得分: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 :(得分: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%,登录完成后没有语句进展它。
答案 3 :(得分:-2)
您可能需要repaint
和invalidate
。
尝试
signInProgressBar.invalidate();
signInProgressBar.repaint();
以及为signInProgressBar.setValue