简体   繁体   English

JProgressBar在下载过程中不会更新

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM