Java JProgressBar在下载期间不更新
使用swing按钮,我试图下载一个html文件并将其写入一个新的html文件,同时执行一个进度条。当我点击按钮时,我的程序似乎冻结,直到下载完成,然后进度条突然变成100%。我不太确定如何解决这个问题,因为我是java新手Java JProgressBar在下载期间不更新,java,swing,concurrency,jbutton,jprogressbar,Java,Swing,Concurrency,Jbutton,Jprogressbar,使用swing按钮,我试图下载一个html文件并将其写入一个新的html文件,同时执行一个进度条。当我点击按钮时,我的程序似乎冻结,直到下载完成,然后进度条突然变成100%。我不太确定如何解决这个问题,因为我是java新手 private void jButton2MouseReleased(java.awt.event.MouseEvent evt) { try { URL oracle = new URL("http://mywebsite.com");
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());
}
}这是因为您在同一线程中下载和更新进度条-这就是为什么gui在下载完成后会得到实际更新
使用单独的工作线程进行下载,如上文所述,它应该可以工作。这是因为您在同一线程中下载和更新进度条-这就是gui在下载完成后实际更新的原因 使用单独的工作线程进行下载,如上文所述,它应该可以工作。我建议使用SwingWorker。它是为这样的问题而设计的。下面是我的代码库中使用不确定进度条的一些代码的片段,但它将帮助您大致了解如何使用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();
当调用worker.execute时;则调用doInBackground。完成doInBackground的计算后,将调用done。完成是对GUI进行任何最终更新的地方
关于我上面的代码,需要注意的一点是,我在执行SwingWorker之前启用了进度条,然后当SwingWorker完成执行时,我禁用了进度条
资源:
我建议用一个SwingWorker。它是为这样的问题而设计的。下面是我的代码库中使用不确定进度条的一些代码的片段,但它将帮助您大致了解如何使用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();
当调用worker.execute时;则调用doInBackground。完成doInBackground的计算后,将调用done。完成是对GUI进行任何最终更新的地方
关于我上面的代码,需要注意的一点是,我在执行SwingWorker之前启用了进度条,然后当SwingWorker完成执行时,我禁用了进度条
资源:
不阻止EDT事件调度线程的可能重复-发生这种情况时,GUI将“冻结”。不要调用Thread.sleepn,而是为重复任务实现一个Swing计时器,或为长时间运行的任务实现一个SwingWorker。有关更多详细信息,请参阅。的可能副本不要阻止EDT事件调度线程-发生这种情况时,GUI将“冻结”。不要调用Thread.sleepn,而是为重复任务实现一个Swing计时器,或为长时间运行的任务实现一个SwingWorker。有关更多详细信息,请参阅。