[英]JProgressBar doesn't update during download
Using a swing button, I'm trying to download an html file and write it to a new html file, while doing a progress bar. 我想使用进度按钮来下载一个html文件,并将其写入新的html文件,同时执行进度条。 When I click the button, my program seems to freeze until the download finishes, and then the progress bar is suddenly 100%. 当我单击该按钮时,我的程序似乎冻结,直到下载完成,然后进度条突然变为100%。 I'm not quite sure how to fix this problem as I am new to java. 我不太确定如何解决此问题,因为我是Java新手。
private void jButton2MouseReleased(java.awt.event.MouseEvent evt) {
try {
URL oracle = new URL("http://mywebsite.com");
URLConnection yc = oracle.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));
String inputLine;
String input_path = "d:/website/updatedsite.html";
WriteFile data = new WriteFile(input_path, false);
int length = yc.getContentLength();
int current = 0;
jProgressBar1.setMaximum(length);
jProgressBar1.setValue(0);
while ((inputLine = in.readLine()) != null) {
data.writeToFile(inputLine);
int i = 0;
for (i = 0; i < length; i++) {
jProgressBar1.setValue(i);
}
}
in.close();
}
catch (java.io.IOException e) {
JOptionPane.showMessageDialog(Frame1.this, "Error " + e.getMessage());
}
} }
This is because you're both downloading and updating the progress bar in the same thread - that's why the gui gets actually updated AFTER the download is finished. 这是因为您同时在同一线程中下载和更新进度条-这就是在下载完成后gui实际上得到更新的原因。
Use a separate worker thread for downloading like explained here and it should work. 使用一个单独的工作线程下载喜欢解释在这里 ,它应该工作。
I'd suggest using a SwingWorker
. 我建议使用SwingWorker
。 It's made for problems such as this. 它是针对此类问题而设计的。 Here is a snippet from some code from my codebase that uses an indeterminate progress bar, but it'll help give you a general idea of what to do ( vui
is a JFrame): 这是我的代码库中使用不确定进度条的一些代码的片段,但这将帮助您大致了解要做什么( vui
是JFrame):
vui.clearOutput();
vui.setOutput("Waiting for items to copy...\n"
+ "This could take several minutes. Please standby...");
vui.disableExit();
vui.disableInput();
vui.disableNext();
vui.showProgressBar();
// make thread so you can disable all options when zipping and enable progress bar
SwingWorker transferWorker = new SwingWorker() {
@Override
protected Void doInBackground() throws Exception {
try {
Process p = Runtime.getRuntime().exec("resources/bin/transferCopier.bat");
StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "ERROR");
StreamGobbler outputGobbler = new StreamGobbler(p.getInputStream(), "OUTPUT");
errorGobbler.start();
outputGobbler.start();
p.waitFor();
} catch (IOException ex) {
Logger.getLogger(VaderController.class.getName()).log(Level.SEVERE, null, ex);
} catch (InterruptedException ie) {
Logger.getLogger(VaderController.class.getName()).log(Level.SEVERE, null, ie);
}
return null;
}
@Override
public void done() {
vui.hideProgressBar();
vui.clearOutput();
vui.setOutput("Transfer Complete!\n\n"
+ "Push \"Exit\" to quit.\n\n");
vui.enableExit();
mode = VaderMode.END;
}
};
transferWorker.execute();
When transferWorker.execute();
当transferWorker.execute();
is performed, doInBackground()
is invoked. 执行后,将调用doInBackground()
。 Once doInBackground()
is done doing its computations, done()
is then invoked. 一旦doInBackground()
完成其计算,便会调用done()
。 done()
is where you would do any final updates to the GUI. done()
是您对GUI进行任何最终更新的地方。
The key things to note about my code above is that I enable the progress bar before executing the SwingWorker
then when the SwingWorker
is done executing, I disable the progress bar. 关于上面的代码,需要注意的关键是在执行SwingWorker
之前先启用进度条,然后在完成SwingWorker
的执行后再禁用进度条。
Resources: 资源:
http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.