IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDT/SwingWorker Java Discussion :

Thread et actionPerformed


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut Thread et actionPerformed
    Bonjour,

    Je suis en train de créer des Thread dans ma méthode actionPerformed(ActionEvent e) car les actions à réaliser sont longues et je ne veut pas bloquer l'interface graphique durant ce temps.

    Mon problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    public void actionPerformed(ActionEvent e)
    	{
    		new Thread(new Runnable() {
    			public void run()
    			{
    			}
    		}).start();
     
    		ee[0]=e;
    		final Thread[] finalThread=new Thread[1];
     
    		finalThread[0]=new Thread(new Runnable(){
    			public void run() {
    				if(ee[0].getSource() instanceof JButton)
    				{
    					JButton b=(JButton)ee[0].getSource();
    Je suis obligé de créer un Thread "vide" au début, sinon, le Thread qui m'interesse ne se lance pas.
    J'aimerais bien comprendre pourquoi il doit y avoir ce morceau de code vide.

    Est ce que par hasard ça viendrait de la façon de créer mon Thread?
    Est-ce qu'il y a des différences d'execution si je le crée en étendant la classe Thread, en implementant l'interface Runnable, ou en le créant comme j'ai fait??

    Merci de vos réponses!!

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Par défaut
    Bonjour,

    Chez moi, le code ci-dessous, adapté du tien, fonctionne.
    Tu devrais regarder également les SwingWorker.

    Cordialement,

    Nicolas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
     
    public class TestFrame {
     
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    JFrame frame = new JFrame("Test");
                    JButton button = new JButton("Appuyez ici...");
                    button.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                            final Thread[] finalThread = new Thread[1];
                            finalThread[0] = new Thread(new Runnable() {
                                public void run() {
                                    System.out.println("coucou");
                                }
                            });
                            finalThread[0].start();
                        }
                    });
                    frame.add(button);
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    }

  3. #3
    Membre éclairé Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut
    Je comprends pas trop pourquoi tu mets tout dans la méthode SwingUtilities.InvokeLater(bla bla)
    Normalement, il n'y a besoin de ne mettre que les méthode qui affectent les affichages graphiques dedans?

    Et puis, quand on définit un JButton mais uniquemement pour récupérer l'action comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if(ee[0].getSource() instanceof JButton)
    {
          JButton b=(JButton)ee[0].getSource();
          if(b.getActionCommand().equals("TransformSingle"))
                {
                       blabla();
                }
          }
    }
    ça n'affecte pas le graphique, donc normalement il n'y aurait pas besoin d'utiliser de SwingUtilities.InvokeLater, si??

    Autant que questions qui 'empêchent de dormir!! Le suspence est à son comble!!

    Merci encore de vos réponses :-)


    EDIT :
    Ton bout de code ne s'adapte pas à mon cas :-S je suis toujours obligé de mettre un Thread vide au début, combien même je crée un SwingUtilities.InvokeLater(new Runnable()...

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Par défaut
    Sur l'utilité de SwingUtilities.invokeLater :
    http://www.developpez.net/forums/d45...-quoi-ca-sert/

    je suis toujours obligé de mettre un Thread vide au début
    Cela me semble anormal. Peux-tu poster un SSCCE?

    Nicolas

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Août 2008
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 265
    Par défaut
    Tout cela me fait penser à une chose :

    Les méthodes ActionPerformed() ne sont-elles pas déjà lancées dans un Thread ?

    Je me souviens que c'est le cas pour l'update() d'une implémentation d'Observer par exemple.

  6. #6
    Membre éclairé Avatar de Balbuzard
    Profil pro
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Par défaut
    La méthode ActionPerformed semble être exécutée dans l'EDT car lors d'un calcul long, il y a blocage de l'interface graphique. C'est d'ailleurs pour ça que je crée un nouveau Thread, pour plus qu'elle soit exécutée dans l'EDT et ainsi permettre le raffraichissement de mon interface.

    Mais je suis un peu inquiet avec mon morceau de code mort, est-ce qu'il risque de faire des trucs bizzares? (je pense pas, mais en même temps je comprends pas pourquoi si je l'enlève, alors qu'il ne fait rien, plus rien ne fonctionne :-S)

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo