Esta es una de esas preguntas que me alegra de haber comprado Robinson & Vorobiev's book on Swing.
Cualquier cosa que accede al estado de un java.awt.Component
se debe ejecutar dentro de la EDT, con tres excepciones: cualquier cosa documentado específicamente como hilo de seguridad, tales como repaint()
, revalidate()
, y invalidate()
; cualquier componente en una interfaz de usuario que aún no haya sido realizado; y cualquier Componente en un Applet antes de que se haya llamado al start()
de Applet.
Los métodos especialmente fabricados a prueba de hilos son tan poco comunes que a menudo es suficiente simplemente recordar los que sí lo son; generalmente también puede salirse con la suya asumiendo que no existen tales métodos (es perfectamente seguro envolver una llamada de repintado en un SwingWorker, por ejemplo).
Realizado significa que el componente es o bien un contenedor de nivel superior (como JFrame) en el que cualquiera de setVisible(true)
, show()
, o pack()
que se ha llamado, o se ha añadido a un componente dado cuenta. Esto significa que está perfectamente bien construir su UI en el método main(), como lo hacen muchos ejemplos de tutoriales, ya que no llaman al setVisible(true)
en el contenedor de nivel superior hasta que se hayan agregado todos los Componente, fuentes y bordes configurados, etc.
Por razones similares, es perfectamente seguro construir la interfaz de usuario de su applet en su método init()
, y luego llamar al start()
después de que esté todo construido.
Envoltura posterior Los cambios de componentes en Runnables para enviar a invokeLater()
se vuelven fáciles de conseguir después de hacerlo solo unas pocas veces. Lo único que me molesta es leer el estado de un Componente (por ejemplo, someTextField.getText()
) desde otro subproceso. Técnicamente, esto tiene que ser envuelto en invokeLater()
, también; en la práctica, puede hacer que el código sea feo y rápido, y con frecuencia no me molesto, o tengo cuidado de obtener esa información en el momento inicial del manejo del evento (normalmente es el momento adecuado para hacerlo en la mayoría de los casos).
También hay un método invokeAndWait(), pero use invokeLater() siempre que sea posible. – Powerlord
Use invokeAndWait si desea puntos muertos. ;) –
O se pagan por hora. :-) –