2010-06-10 9 views
9

En Java, para crear y mostrar un nuevo JFrame, simplemente hacer esto:¿Por qué la gente corre Java GUI en la cola de eventos

public static void main(String[] args) { 
    new MyCustomFrameClass().setVisible(true); 
} 

Sin embargo, he visto a muchas personas haciendo de esta manera:

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      new MyCustomFrameClass().setVisible(true); 
     } 
    }); 
} 

¿Por qué? ¿Hay alguna ventaja?

Respuesta

8

Las reglas que rigen lo que debe realizarse en el EDT (veo que "EDT" se usa con más frecuencia que "Event Queue") han cambiado durante la vida útil de Java. Y cada vez que las "reglas" cambiaban, Sun aconsejaba hacer más y más trabajos relacionados con "GUI" en el EDT.

¿Por qué las personas ejecutan Java GUI en el EDT?

  • Debido a las directrices oficiales aconsejan hacerlo.

  • Porque hacerlo ayudará a evitar una gran cantidad de errores relacionados con la GUI.

Tenga en cuenta, y esto no es muy bien sabido, que el EDT en realidad hace accidente de vez en cuando, porque oscilación en sí tiene algunos errores. Cada aplicación Swing no trivial está utilizando Swing API que tienen, bueno, errores y, por tanto, de vez en cuando el EDT muere.

Nunca lo ve y no es motivo de preocupación, porque cuando el EDT muere, se reinicia automágicamente.

Básicamente, haga todas las cosas relacionadas con la GUI en el EDT y realice todas las operaciones largas fuera del EDT (para no bloquear el EDT).

EDIT ha pedido un ejemplo de cómo ejecutar una operación larga fuera del EDT. Hay varias formas de hacer esto. En el caso más simple, simplemente crea e inicia un nuevo subproceso, desde el EDT. Aquí está un ejemplo: la devolución de llamada oyente se llama cuando el usuario hace clic en un botón, se sabe que este acontezca en la EDT ...

JButton jb = ... 
    jb.addActionListener(new ActionListener() { 
     public void actionPerformed(final ActionEvent e) { 
      final Thread t = new Thread(new Runnable() { 
      public void run() { 
      // this shall get executed, after start() has been called, outside the EDT  
      } 
      }); 
      t.start(); 
     } 
    }); 

Para ejemplos más complicados, que desea leer en SwingWorker , etc.

+0

¿Cómo puedo hacer operaciones fuera del EDT si es necesario iniciarlas desde mi GUI? (evento de botón, etc.) Además, ¿necesito usar el EDT solo para el cuadro principal? Si el usuario abre otro JFrame desde el marco principal (por ejemplo, una ventana de opción), ¿necesito iniciarlo en el EDT? – asmo

+0

@asmo: Voy a editar mi pregunta para dar un ejemplo – NoozNooz42

+0

@asmo: necesita el trabajo en el EDT para * todo * relacionado con la GUI (entonces en su * "ventana de opciones" * ejemplo, sí, eso necesita hacerse en el EDT también). – NoozNooz42

4

Esta línea es la modificación de un componente Swing desde su marco personalizado es una subclase de JFrame:

new MyCustomFrameClass().setVisible(true); 

En general, nunca se debe modificar un componente Swing menos que esté en el hilo de eventos de Despacho (EDT).

El siguiente código se ejecutará en el Runnable en el EDT.

EventQueue.invokeLater(Runnable); 

Ahora, la llamada setVisible(true) estará en la EDT como debería.

+0

Quise crear una instancia de una subclase JFrame, no directamente un JFrame. Perdón por la confusion.(Actualicé mi publicación original) – asmo

+0

Lo mismo se aplica a cualquier subclase de cualquier componente de swing. No cambia nada (@asmo) – jjnguy

+0

Gracias por la aclaración. – asmo

Cuestiones relacionadas