Pregunta

Tengo una pregunta acerca de la 'distribución de eventos Tema'. Tengo una clase principal que es también un JFrame. Se inicializa el resto de los componentes en el código, algunas de ellas no implican Swing y algunos de ellos lo hacen. ¿Es suficiente con simplemente inicializar el Clase principal usando la EDT así? ...

public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new Main();
        }
    });
}

De esta manera todo lo que se ejecutan en el hilo de eventos distribuidor.

¿Fue útil?

Solución

Esto es generalmente suficiente hasta que comience a hacer uso de hilos de fondo para la adquisición de datos, cálculos, etc. Luego hay que empezar teniendo cuidado de verificar que usted está en la EDT antes de cambiar un componente swing o su modelo.

Se puede probar si usted está ejecutando en el EDT con:

    if (SwingUtilities.isEventDispatchThread()) {
        // Yes, manipulate swing components
    } else {
        // No, use invokeLater() to schedule work on the EDT
    }

Además, consulte la clase SwingWorker para más detalles sobre cómo entregar el trabajo para un subproceso de fondo y los resultados del proceso de la EDT

Otros consejos

Este es el camino a seguir. La única cosa que usted debe tener cuidado es si un oyente que se registra en los componentes Swing generará un nuevo hilo (a menudo para llevar a cabo algún tiempo de cálculo). Tales nuevos temas tendrán que utilizar invokeLater si se van a llevar a cabo operaciones de interfaz gráfica de usuario.

Esa es la manera en todos los ejemplos de la labor tutorial solar. Lea la sección del tutorial Swing en de concurrencia para más información sobre por qué se hace de esta manera.

Devon_C_Miller 's respuesta es correcta. Sólo quiero señalar un acceso directo a la invocación de la rosca de distribución de eventos.

Así es como me pongo todas mis aplicaciones Swing.

import javax.swing.SwingUtilities;

import com.ggl.source.search.model.SourceSearchModel;
import com.ggl.source.search.view.SourceSearchFrame;

public class SourceSearch implements Runnable {

    @Override
    public void run() {
        new SourceSearchFrame(new SourceSearchModel());

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new SourceSearch());
    }

}

Se puede copiar esto a cada proyecto Swing, con sólo cambiar los nombres.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top