una - mostrar texto en ventana java
¿Cómo pueden funcionar los diálogos de Swing? (2)
Si abre un cuadro de diálogo en Swing, por ejemplo, un JFileChooser, se parece a este pseudocódigo:
swing event thread { create dialog add listener to dialog close event { returnValue = somethingFromDialog } show dialog (wait until it is closed) return returnValue }
Mi pregunta es: ¿cómo puede funcionar esto? Como puede ver, el hilo espera volver hasta que se cierre el cuadro de diálogo. Esto significa que el hilo del evento Swing está bloqueado. Sin embargo, uno puede interactuar con el diálogo, que AFAIK requiere que se ejecute este hilo.
Entonces, ¿cómo funciona eso?
El subproceso de distribución de eventos existente está bloqueado, por lo que swing crea otro hilo que bombea los eventos. Este es el hilo de despacho de eventos para la duración del diálogo.
Swing crea un subproceso nativo separado para bombear mensajes de la ventana del SO nativo. Esto es independiente de la cadena de eventos AWT.
En Windows, ves estos hilos
"AWT-Windows" - the native UI thread
"AWT-EventQueue-0" - the current AWT event dispatch thread
EDITAR: El downvote es correcto. Esto no es cierto, al menos no en todos los casos.
Los diálogos modales a menudo se encargan de bombear eventos de AWT. Si ejecuta el código
SwingUtilities.invokeAndWait(new Runnable()
{
public void run()
{
JOptionPane.showInputDialog("hello");
}
});
y luego rompa, mirando los hilos, solo verá un hilo de EventQueue. El método show () de los eventos de bombas JOptionPane en sí.
Los marcos como Spin y Foxtrot adoptan el mismo enfoque: le permiten crear un método de bloqueo de ejecución prolongada en la EDT, pero mantienen los eventos fluyendo al bombear eventos. Es posible que swing tenga varios subprocesos de despacho (estoy seguro de que este fue el caso de versiones anteriores de swing) pero ahora que el multinúcleo es común, los problemas de concurrencia, en particular aseguran que los cambios en un subproceso se publiquen correctamente en otros subprocesos, significa que el uso de múltiples EDT produce errores en la implementación actual. Ver múltiples temas de despacho de eventos Swing
Es el hilo de AWT, no de Swing.
De todos modos, AWT ejecuta el bucle de despacho dentro del show
. Los eventos de entrada a las ventanas bloqueadas están bloqueados. Los eventos de repintado, los eventos a las ventanas desbloqueadas y los eventos generales se envían como de costumbre.
Puedes ver esto agregando la línea:
Thread.dumpStack();
en el manejo uniforme del diálogo modal, o más fácilmente desde la línea de comandos con jstack
o use ctrl-/
/ ctrl-break
en la ventana de comandos de la aplicación.
La biblioteca Foxtrot abusa de esto para proporcionar un modelo más procedimental (en lugar de basado en eventos). También es utilizado por WebStart / Java PlugIn para proporcionar cuadros de diálogo para los servicios JNLP y otros cuando se llama desde la aplicación EDT.