Todo lo que acceda a los objetos Swing debe hacerlo a través del hilo de envío del evento (EDT). Hay una pequeña excepción a esto (que mencionaré más adelante). El propósito del EDT es procesar cualquier evento que pueda ocurrir debido a IO (eventos de mouse y teclado). Gran parte del tiempo esto puede significar alterar el diseño de su GUI. Swing no fue desarrollado para ser seguro para subprocesos, lo que significa que si dos subprocesos intentan modificar el mismo componente al mismo tiempo, entonces puede terminar con una GUI corrupta. Como ya hay un hilo conocido para acceder a los componentes Swing (EDT), ningún otro hilo debe intentar modificarlos o incluso leer su estado.
Ahora, para el caso excepcional cuando puede manipular objetos Swing fuera del EDT. Antes de que los componentes se hayan vuelto visibles, no es posible que IO esté desencadenando eventos. Por lo tanto, el hilo principal puede configurar una GUI Swing y luego establecer un solo JFrame para que sea visible. Como ahora hay un marco visible, pueden ocurrir eventos de IO y el hilo principal no debe intentar modificar ningún otro componente de Swing. Solo debería usar esta opción para iniciar una GUI, y realmente solo con problemas de juguete.
Lo que estoy diciendo es que lo siguiente está bien y no causará problemas si solo estás jugando con cosas.
public static void main(String[] args) {
// create components
JFrame f = new JFrame();
...
// do layout and other bits of setup
// show gui to user
f.setVisible(true);
}
¿Cuándo no me estoy ejecutando bajo el EDT? Entonces, ¿a qué te refieres es que si hago un hilo para cambiar algo, debería ejecutarlo con uno de estos métodos, verdad? Pero no estoy haciendo otro hilo, solo estoy ejecutando el hilo predeterminado ¿no? Entonces, ¿no sería innecesario hacer setVisible en invokeAndWait? –
Si lo está ejecutando en el subproceso "principal" (predeterminado), entonces * no * está en el EDT. – Darkhogg
Eche un vistazo a los enlaces en la respuesta de @ Robin. El hilo principal no es lo mismo que el hilo EDT, pero a menudo el código que está ejecutando con Swing es código para manejar un evento y, por lo tanto, en el EDT. –