usar thread progressbar personalizar cargando bar java swing jprogressbar

java - thread - JProgressBar no está progresando



progressbar java thread (2)

Así que estoy tratando de hacer un descargador que muestre el progreso de la descarga con una barra de progreso. Pero estoy teniendo problemas ya que en realidad no actualiza la barra de progreso. Básicamente se mantiene blanco, cuando debe ser azul. Si alguien puede ayudar, el código está a continuación.

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



Como @happyburnout ha señalado, sería mejor que procesara la descarga en un hilo separado, usar un SwingWorker es probablemente la mejor solución para lo que está haciendo.

La razón principal es que está bloqueando el hilo de distribución de eventos (AKA EDT), impidiendo que se procese cualquier solicitud de repintado (y otras cosas importantes de la interfaz de usuario).

Deberías tener una lectura

Ahora esto se toma casi directamente de los documentos API, pero da una idea básica de un SwingWoker con un JProgressBar

El trabajador"...

public class Worker extends SwingWorker<Object, Object> { @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; }

El "panel de progreso"

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

Recuerda las reglas de oro de Swing

  • Nunca, nunca, nunca actualice un componente de interfaz de usuario de ningún Thread no sea el EDT
  • Realice siempre tareas que consumen mucho tiempo en un Thread diferente
  • (Algo, algo, algo sobre los administradores de diseño, eso es algo más personal;))

Y tendrás un momento feliz y fácil con Swing: D