2013-07-01 1 views
2

Используя кнопку поворота, я пытаюсь загрузить html-файл и записать его в новый html-файл, выполняя индикатор выполнения. Когда я нажимаю кнопку, моя программа, похоже, замерзает, пока загрузка не завершится, а затем индикатор выполнения на 100%. Я не совсем уверен, как исправить эту проблему, поскольку я новичок в java.JProgressBar не обновляется во время загрузки

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()); 
} 

}

+0

возможно дубликат [JProgressBar не будет обновлять] (http://stackoverflow.com/questions/13094666/jprogressbar-wont-update) –

+0

Не блокирующие EDT (Event Dispatch Thread) - графический интерфейс «замораживается», когда это произойдет. Вместо вызова 'Thread.sleep (n)' реализовать Swing 'Timer' для повторения задач или' SwingWorker' для длительных задач. Подробнее см. [Параллелизм в Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/). –

ответ

2

Это потому, что вы оба загрузки и обновления индикатор выполнения в том же потоке, - вот почему графический интерфейс получает фактически обновляется после завершения загрузки.

Используйте отдельный рабочий поток для загрузки, как описано here, и он должен работать.

1

Я предлагаю использовать 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(); 

Когда transferWorker.execute(); выполняется, Вызывается doInBackground(). После того, как doInBackground() выполнил свои вычисления, затем вызывается done(). done() - это то, где вы будете делать окончательные обновления графического интерфейса.

Ключевыми факторами, которые следует учитывать в моем коде выше, является то, что я включаю индикатор выполнения перед выполнением SwingWorker, а затем, когда выполняется SwingWorker, я отключу индикатор выполнения.

Ресурсы:

http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html