JProgressBar geht nicht voran

Also versuche ich einen Downloader zu machen, der den Fortschritt des Downloads mit einem Fortschrittsbalken anzeigt. Aber ich habe Probleme, da es den Fortschrittsbalken nicht wirklich aktualisiert. Grundsätzlich bleibt es weiß, wenn es blau sein soll. Wenn jemand helfen könnte, ist der Code unten.

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){} } 

   

Verwenden Sie eine Kombination mit SwingWorker. Sehen Sie ein Beispiel hier: SwingWorker und Progress Bar

@ Hovercraft: Du hast Recht. Erlaube mir, auf die entsprechende SwingWorker-Seite von JavaDoc zu verweisen, was meiner Meinung nach die Situation am besten erklärt.

Wie @happyburnout gezeigt hat, wäre es besser, wenn Sie den Download in einem separaten Thread durchführen. Die Verwendung eines SwingWorker ist wahrscheinlich die beste Lösung für das, was Sie tun.

Der Hauptgrund dafür ist, dass Sie den Event Dispatching Thread (AKA EDT) blockieren und verhindern, dass Repaint-Anfragen (und andere UI-wichtige Dinge) verarbeitet werden.

Du solltest dich durchlesen

  • Nebenläufigkeit im Swing
  • Arbeiter Threads und Swing Worker

Nun wird dies fast direkt von den API-Dokumenten übernommen, aber es gibt eine Grundidee eines SwingWoker mit einer JProgressBar

Der Arbeiter”…

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

Der "Fortschrittsbereich"

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

Erinnere dich an die goldenen Regeln von Swing

  • Niemals, nie, niemals eine UI-Komponente von einem anderen Thread dem EDT aktualisieren
  • Führen Sie zeitraubende Aufgaben immer auf einem anderen Thread
  • (Etwas, etwas, etwas über Layout-Manager - das ist eher eine persönliche Sache;))

Und Sie werden eine glückliche und leichte Zeit mit Swing haben: D