2010-10-07 5 views
16

Una pregunta tonta, pero realmente no puedo hacer que esto funcione: Tengo un proceso largo en una aplicación Swing que puede llevar varios minutos. Quiero mostrar un diálogo de progreso al usuario mientras este proceso está en curso. También quiero evitar que el usuario realice más acciones, por ejemplo, presionando un botón mientras el proceso está en marcha.Diálogo modal de bloqueo sin bloqueo Swing progress

Si realizo el proceso en el EDT, esto obviamente evita que el usuario final haga algo mientras el proceso está en curso. Pero debido a que el EDT está ocupado procesando, nunca pasa a renderizar el contenido del diálogo, así que solo obtengo el contorno del diálogo.

Pero si hago el proceso en un subproceso de trabajo, el usuario final puede hacer clic en los botones y hacer que el EDT para manipular el estado que el trabajador también está manipulando al mismo tiempo, con cosas malas como consecuencia. Si hago el diálogo modal, eso no ocurre, pero modal en Swing también implica bloqueando, por lo que en el momento que llamo a setVisible(true), el hilo bloquea para siempre.

Así que mi "solución" actual es usar un hilo de trabajo, y luego engendrar un hilo separado cuyo único propósito es absorber la naturaleza de bloqueo de setVisible. ¡Seguramente debe haber una mejor solución!

Entonces, ¿cómo obtengo un diálogo que impide que el usuario interactúe con el resto del sistema (modal) pero no bloquea el hilo que hace que sea visible?

+0

Consulte también: http://stackoverflow.com/questions/3954120/swing-modal-dialog-refuses-to-close-sometimes – Zarkonnen

Respuesta

15

Debe evitar que el usuario interactúe con GlassPane. Lo bueno es que esto es modal para el usuario y no su programa, por lo que su hilo no se bloqueará.

La buena noticia es que también puede usarlo para efectos de GUI geniales como sombrear la parte de la GUI ocupada y con la que el usuario no puede interactuar. También puede mostrar una imagen gif ocupada en GlassPane.

enlaces: -

  1. Official tutorial on GlassPane
  2. Some helpful tutorials
  3. Another tut
  4. Oreilly's Swing Hacks es excelente.
0

Debe estar haciendo algo mal. Pruebe el tutorial en How to Use Progress Bars. Si puede entender cómo funciona ese código, debe darle la dirección para lograr la función requerida.

Tenga en cuenta que las barras de progreso suelen ser modales.

+0

El código en el tutorial no produce modales barras de progreso/cuadros de diálogo. Todavía puedo manipular la GUI mientras el proceso se está ejecutando en SwingWorker. – Zarkonnen

+0

@Zarkonnen Supongo que se refiere a las demostraciones de ProgressMonitor. Pruebe una JProgressBar en un diálogo modal en su lugar. –

+0

Lo han hecho. Pero si ejecuta la demostración, aún puede manipular la ventana principal mientras se muestra el monitor de progreso. Si hago un reemplazo para el monitor de progreso, deja de funcionar, ya que el EDT está nuevamente atascado esperando que setVisible regrese. – Zarkonnen