JProgressBar non sta progredendo

Quindi sto cercando di creare un downloader che mostri l’avanzamento del download con una barra di avanzamento. Ma sto avendo problemi dal momento che in realtà non aggiorna la barra di avanzamento. Fondamentalmente rimane bianco, quando è destinato ad essere blu. Se qualcuno può aiutare, il codice è sotto.

JProgressBar progressBar = new JProgressBar(0, ia); con.add(progressBar, BorderLayout.PAGE_START); con.validate(); con.repaint(); progressBar = new JProgressBar(0, ia); progressBar.setValue(0); System.out.print("Downloading Files"); while ((count = in.read(data, 0, downloadSpeed)) != -1){ fout.write(data, 0, count); if (count >= 2){ progressBar.setString("Downloading : " + ia + " @ " + count + "Kbs per second"); } else { progressBar.setString("Downloading : " + ia + " @ " + count + "Kb per second"); } progressBar.setValue(count); con.add(progressBar, BorderLayout.PAGE_START); try{ Thread.sleep(1000); } catch (Exception e){} } 

Utilizzare una combinazione con SwingWorker. Guarda un esempio qui: SwingWorker e barra di avanzamento

@Hovercraft: hai ragione. Consentitemi di fare riferimento alla corrispondente pagina SwingWorker di JavaDoc , a mio avviso questo spiega la situazione migliore.

Come ha sottolineato @happyburnout, è meglio elaborare il download in un thread separato, utilizzando SwingWorker è probabilmente la soluzione migliore per quello che stai facendo.

Il motivo principale è il blocco del thread di invio eventi (AKA EDT) dall’esecuzione, impedendo che eventuali richieste di ridisegno (e altre informazioni importanti sull’interfaccia utente) siano state elaborate.

Dovresti avere una lettura

  • Concorrenza in swing
  • Thread di lavoratori e lavoratore Swing

Ora questo è preso quasi direttamente dai documenti API, ma dà un’idea di base di SwingWoker con un JProgressBar

Il lavoratore”…

 public class Worker extends SwingWorker { @Override protected Object doInBackground() throws Exception { // The download code would go here... for (int index = 0; index < 1000; index++) { int progress = Math.round(((float)index / 1000f) * 100f); setProgress(progress); Thread.sleep(10); } // You could return the down load file if you wanted... return null; } 

Il "riquadro di avanzamento"

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

Ricorda le regole d'oro di Swing

  • Mai, mai, mai aggiornare un componente dell'interfaccia utente da alcun Thread diverso dall'EDT
  • Esegui sempre attività che richiedono tempo su un Thread diverso
  • (Qualcosa, qualcosa, qualcosa sui gestori di layout - è più una cosa personale;))

E avrai un momento felice e facile con Swing: D