Threads d'interface utilisateur Java swing et événements de bouton d'événement


Pour autant que j'aie compris, tous les composants swing doivent être créés, modifiés et interrogés uniquement à partir de l'EDT.
Donc, s'il m'arrive d'appuyer sur un JButton "soumettre", disons, cela va emballer toutes les informations des zones de texte, envoyer ces données au contrôleur, puis le contrôleur les enverra à d'autres contrôleurs qui finiront par envoyer des choses au serveur. Sur quel thread est l'action de ce bouton? S'il s'exécute sur EDT, comment le quitter pour envoyer les données au contrôleur depuis le thread principal? Dois-je même utiliser le thread principal pour envoyer des données au serveur à partir du contrôleur?

Donc ce que je dis est ceci

java.awt.EventQueue.invokeLater(new Runnable()
{
    @Override
    public void run()
    {
        JButton button = new JButton("Submit");
        button.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                // WHAT THREAD DO ACTIONS HERE RUN ON?
                // AND HOW DO I MAKE THEM RUN ON MAIN THREAD?
                // AND WHAT THREAD SHOULD I RUN THING ON HERE?
            }
        });
    }
});
Author: Quillion, 2014-03-21

1 answers

Toute action déclenchée par Swing s'exécutera sur l'EDT. Ainsi, le code de votre méthode actionPerformed sera déjà exécuté sur l'EDT, sans aucune manipulation particulière de votre part.

Pour commencer un travail de longue haleine, comme l'envoi de données à un serveur, utilisez un SwingWorker ou un Callable et ExecutroService.

Je préfère utiliser un SwingWorker lors de l'implémentation d'une interface utilisateur Swing, tout comme une API utile pour publier des mises à jour et faire les rappels lorsque la tâche est effectuée automatiquement sur l'EDT.

 2
Author: haraldK, 2014-03-21 13:46:44