JProgressBar no se actualizará

Estoy tratando de encontrar el código que encontré en la respuesta a esta pregunta: Descargar archivo usando java apache commons?

Es una aplicación de descarga, eche un vistazo, (no estoy muy familiarizado con JFrames y ActionEvents)

Download.java

package main; public class Download extends JFrame implements Runnable{ public static int total; public static int done; private static class ProgressListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { done = (int)((DownloadCountingOutputStream) e.getSource()).getByteCount(); jbar.repaint(); DownloadCountingOutputStream.parent.draw((int)((DownloadCountingOutputStream) e.getSource()).getByteCount());//redraw DownloadCountingOutputStream.parent.repaint(); } } public static JProgressBar jbar = new JProgressBar(); public void draw(int downloaded){System.out.println("downloaded: "+downloaded+ " Total: "+total); if (downloaded== 0){ Container cont = new Container(); setDefaultCloseOperation(3); setSize(600, 450); setResizable(false); setVisible(true); cont.add(jbar); jbar.setBounds(40, 50, 500, 50); jbar.setMaximum(total);//The total value of bytes to download //jbar.setValue(50); add(cont); jbar.setVisible(true); } jbar.setValue(downloaded); //This should update the value of the progress Bar } public void run() { URL dl = null; File fl = null; OutputStream os = null; InputStream is = null; ProgressListener progressListener = new ProgressListener(); draw(done); try { fl = new File(System.getProperty("user.home").replace("\\", "/") + "/Desktop/afile.rar"); dl = new URL("https://dl.dropbox.com/u/48076798/afile.rar"); os = new FileOutputStream(fl); is = dl.openStream(); total = Integer.parseInt(dl.openConnection().getHeaderField("Content-Length")); String total = dl.openConnection().getHeaderField("Content-Length"); DownloadCountingOutputStream dcount = new DownloadCountingOutputStream(os); dcount.setListener(progressListener); dcount.setParent(this); IOUtils.copy(is, dcount); } catch (Exception e) { System.out.println(e); } finally { if (os != null) { try { os.close(); } catch (IOException e) { e.printStackTrace(); } } if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } } } 

DownloadCountingOutputStream.java

 package main; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.io.OutputStream; import org.apache.commons.io.output.CountingOutputStream; public class DownloadCountingOutputStream extends CountingOutputStream { private ActionListener listener = null; public static Download parent; public DownloadCountingOutputStream(OutputStream out) { super(out); } public void setListener(ActionListener listener) { this.listener = listener; } public void setParent(Download o){ parent = o; } @Override protected void afterWrite(int n) throws IOException { super.afterWrite(n); if (listener != null) { listener.actionPerformed(new ActionEvent(this, 0, null)); } } } 

Es difícil de decir a partir de la muestra de código que ha proporcionado …

La causa principal de este problema es tratar de actualizar la interfaz de usuario mientras se bloquea desde el subproceso de distribución de eventos (EDT).

Es importante NUNCA realizar operaciones de larga ejecución o locking dentro del EDT ya que esto evitará que se actúe sobre las solicitudes de repintado.

Para obtener más información, lea a través de Concurrency en Swing

El siguiente ejemplo demuestra el uso de un SwingWorker que proporciona actualizaciones de progreso que se vuelven a sincronizar con la interfaz de usuario

 public class TestProgress { public static void main(String[] args) { new TestProgress(); } public TestProgress() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { } catch (InstantiationException ex) { } catch (IllegalAccessException ex) { } catch (UnsupportedLookAndFeelException ex) { } ProgressPane progressPane = new ProgressPane(); JFrame frame = new JFrame("Test"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(progressPane); frame.setSize(200, 200); frame.setLocationRelativeTo(null); frame.setVisible(true); progressPane.doWork(); } }); } public class ProgressPane extends JPanel { private JProgressBar progressBar; public ProgressPane() { setLayout(new GridBagLayout()); progressBar = new JProgressBar(); add(progressBar); } public void doWork() { Worker worker = new Worker(); worker.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if ("progress".equals(evt.getPropertyName())) { progressBar.setValue((Integer) evt.getNewValue()); } } }); worker.execute(); } } public class Worker extends SwingWorker { @Override protected Object doInBackground() throws Exception { for (int index = 0; index < 1000; index++) { int progress = Math.round(((float) index / 1000f) * 100f); setProgress(progress); Thread.sleep(10); } return null; } } }