Como puedo hacer un ProgressBar de forma correcta?

Que tal comunidad, tengo una duda y quisiera saber si alguien puede apoyarme al respecto. Les platico, estoy haciendo una aplicación en swing y cada vez que se ejecute un proceso a través de un botonazo se debe mostrar una barra de progreso, la cual si se muestra pero pues no mas no se ve el avance. Mi código resumido es el siguiente:

Mi form:
 

El Bussines:
 

Como lo dije, no puse todo el código y espero no haber omitido nada importante. ¿Debo cambiar mi código para que funcione mi progress bar o que me recomiendan hacer? Porque así como lo tengo si se muestra pero nunca se ve el avance de la barra, agradezco su tiempo y su ayuda. Saludos.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de AlexSnake

Aun no

Habia publicado una solucion, pero no es correcta.

Imagen de ezamudio

EDT

Seguramente tienes la misma bronca de todo mundo... esa tarea larga que vas a realizar, que es la razón por la que vas a mostrar una barra de progreso, la debes realizar fuera del EDT. El EDT es el Event Dispatch Thread, que es el hilo dedicado a manejar todos los eventos de Swing.

Cuando el usuario oprime un botón en tu GUI, desde el EDT se invoca el método del botón que a su vez invocará los   de los  s del mismo. Si ahí realizas la tarea larga, estás acaparando el EDT y por lo tanto la GUI no se actualiza.

Lo que necesitas es realizar tu tarea en un hilo separado, para liberar el EDT, y de vez en cuando el hilo de tu tarea (denominado worker thread) debe actualizar la barra de progreso.

Si estás usando Java, aprovecha la clase SwingWorker.

Imagen de AlexSnake

Oks

Gracias ezamudio, si suponia que tenia que ver algo con el   pero no sabia que se fuera a complicar tanto, pero bueno a darle... revisare la clase SwingWorker y vere que puedo hacer. Saludos.

Imagen de ezamudio

Ejemplo

Lo hago en Groovy porque me da muuuuucha hueva estar escribiendo código Java para Swing....

Esto es lo que estás haciendo:

 

(en Groovy es preferible que en vez de crear clases anónimas para implementar interfaces de un sólo método, pases mejor un closure y le hagas cast a la interfaz, resulta en lo mismo).

Ese código que imprime 10 veces "jeteando un segundo" corre en el EDT, por lo tanto nunca se ve que se actualice la barra de progreso, simplemente se queda pasmada la GUI 10 segundos y al final la barra aparece completamente llena.

Para que funcione como quieres, hay que hacer esto (en Groovy habría incluso maneras más sencillas pero tú lo vas a hacer en Java así que usemos el SwingWorker):

 

Parece mucho relajo, pero realmente no lo es: Ahora el ActionListener lo que hace cuando oprimes el botón, es crear un Trabajador y agregarle un PropertyChangeListener, que escucha cuando alguna propiedad cambia (SwingWorker notifica de cambios en sus propiedades progress y state). Ese listener lo único que hace es que cuando cambia la propiedad progress del worker, actualiza la barra de progreso.

Las ventajas de todo este relajo:
- Bajo acoplamiento, porque ese código que hace la tarea tardada lo puedes tener en un componente separado (yo lo puse por simplicidad dentro del mismo SwingWorker, pero el SwingWorker podría ser un simple envoltorio para invocar esa tarea).
- La sincronización entre el hilo trabajador y el EDT lo hace Swing, tú no te tienes que preocupar por sincronizar nada; el método doInBackground se ejecutará en el hilo trabajador, pero los PropertyChangeListeners son invocados desde el EDT.
- Algunas invocaciones a los PropertyChangeListeners pueden ser ignoradas por performance. De este modo si cambias la propiedad progress del worker 100 veces, puede que solamente invoquen los listeners 10 veces, para tampoco atascar el EDT.

Imagen de AlexSnake

Entendido

No pues, muchas gracias ezamudio la neta me sacaste del bache en el que estaba ataskado, mas adelante mostrare la forma en que lo implemente pero claro con java, ademas con tu ejemplo me despierta mas el gusto por aprender Groovy, pero antes tengo que dominar mejor java.

Imagen de Nopalin

Tambien puedes echarle un

Tambien puedes echarle un vistazo a la libreria spin,

Sobres

Imagen de AlexSnake

pBar con Java

Aun que realmente la solución que implemente es realmente similar o casi igual a lo que ezamudio publico, pues la pongo con la finalidad de que le pueda servir a alguien mas.

En el Frame:
 

En la clase de negocio:
 

Saludos.

@Nopalin ya stas le echare un vistaso. Saludos

Imagen de Rafael Carrillo

no se si me puedan ayudar con una progress bar

estoy intentando cambiar el relleno de una barra de progreso , sin embargo aunque cambio la propiedad Foreground a un color al momento de ejecutarlo siempre aparece el mismo, seleccione el que seleccione siempre pone un naranja

Mostraría el código pero no lo tengo a la mano ahora

Re: color de JProgressBar

 

Dependiendo del Look And Feel que esté cargado, este tomará en cuenta los colores que se pongan o lo hará parcialmente o no lo hará.

Considera el siguiente código:

 

Algunos ejemplos:

  • Metal

     

  • Nimbus

     

  • Windows Classic

     

  • CDE/Motif

     

En NetBeans, cuando creas, por ejemplo, un  , se agrega código en el método   para cargar el Look And Feel (Nimbus) antes de crear cualquier componente. P.ej.:

 

Quita el   y pon el Look And Feel deseado, pero si quieres utilizar Nimbus, puedes intentar esto.

~~~

Imagen de Rafael Carrillo

gracias

me fue de ayuda

De nada.