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){}
}
Use una combinación con SwingWorker. Vea un ejemplo aquí: SwingWorker y barra de progreso
@Hovercraft: tienes razón. Permítanme referirme a la página SwingWorker correspondiente de JavaDoc , en mi opinión esto explica la situación mejor.
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