/ / Que fait exactement l'appel de la méthode SwingUtilities.invokeLater () dans la classe principale qui exécute une application Swing? - java, swing, interface utilisateur, swingutilities, java-threads

En quoi consiste exactement l'appel de la méthode SwingUtilities.invokeLater () dans la classe principale qui exécute une application Swing? - java, swing, interface utilisateur, swingutilities, java-threads

Je suis assez nouveau Balançoire et j’ai le doute suivant sur cette classe principale qui lance une application Swing fondée sur un projet de tutoriel:

package com.caveofprogramming.designpatterns.demo1;

import javax.swing.SwingUtilities;

import com.caveofprogramming.designpatterns.demo1.controller.Controller;
import com.caveofprogramming.designpatterns.demo1.model.Model;
import com.caveofprogramming.designpatterns.demo1.view.View;

public class Application {

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
runApp();
}

});
}

public static void runApp() {
Model model = new Model();
View view = new View(model);

Controller controller = new Controller(view, model);
}

}

Donc, cette classe contient le principale() méthode qui est la méthode effectuée au démarrage de l'application.

Il effectuer SwingUtilities.invokeLater () méthode qui crée un Runnable objet qui contient le courir() méthode qui effectue elle-même la runApp () méthode qui est le point d'entrée de mon application Swing.

Mon doute est lié à ce que fait exactement le SwingUtilities.invokeLater () méthode. Que fait exactement? et quel est le Runnable objet qui est créé en tant que paramètre de la invokeLater () méthode? Il me semble que c’est un objet qui implémente automatiquement la Runnable interface mais je ne suis pas sûr à ce sujet et il n'est pas clair pour moi pourquoi je dois le faire

Pouvez-vous m'aider à comprendre comment fonctionne exactement l'architecture de cette application Swing simple?

Réponses:

2 pour la réponse № 1

C’est vraiment deux questions en une.

  1. SwingUtilities.invokeLater() s'assure que tout ce que vous voulez faire se produit dans le thread Event Dispatcher. Puisque Swing est strictement mono-fileté, cela est nécessaire pour tout ce qui interagit avec Swing et ne s’exécute pas déjà dans l’EDT (par exemple, il est appelé à la suite d’un gestionnaire d’événements). main() La méthode de votre application en est un exemple, car elle est appelée par la VM au démarrage dans son propre thread séparé (appelé, sans surprise, le thread principal).
  2. C'est un classe intérieure anonyme. C’est un raccourci pour créer une classe qui implémente Runnable et créer immédiatement une instance de cette classe. (Notez que ce n'est pas "t complètement équivalent à faire cela, il y a des détails petits mais importants dans lesquels il est différent.) SwingUtilities.invokeLater() va alors mettre ceci Runnable objet dans la file d’événements Swing, qui sera traité ultérieurement par l’EDT (généralement quelques instants), en run() méthode que vous avez fournie.