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

  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)

  7. #7
    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
    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.
    Oui, oui. Cela pourrait être réalisé encore plus proprement avec un SwingWorker

    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)
    Ce n'est vraiment pas normal. Cela peut traduire un problème plus grave dans ton code. Peux-tu poster un code compilable et exécutable ?

    Nicolas

  8. #8
    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
    Salut,

    Je mets mon code : Je l'ai modifié exprès pour qu'il soit minimal, j'ai toujours le même problème, mais je me demande maintenant si ça vient pas plutôt de ma machine :-S

    Voilà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    if(b.getActionCommand().equals("TransformSingle"))
    {
                 // cette JOptionPane s'affiche			
    	JOptionPane.showMessageDialog(panelAuto, "oui");
    	transformSingleThread=new Thread(new Runnable() {
    	      public void run() {
                             //Cette JOptionPane ne s'affiche pas
    		JOptionPane.showMessageDialo(panelAuto, "oui");
    		stopButtonSingle.setEnabled(true);
                 } 
           });
                transformSingleThread.start();
    }
    Je ne comprends pas ce qui se passe, et pourquoi le problème semble résolu lorsque je mets le Thread mort suivant au début:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    new Thread(new Runnable() {
    	public void run() {
    	}
    }).start();
    Si quelqu'un a un élément de réponse, je lui en serai bien reconnaissant, mon application doit être distribuée sur plusieurs PC, ce serait moyen drôle qu'elle ne fonctionne nulle part :-S

  9. #9
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Pourquoi tu lances un Thread ???
    En plus c'est pas top car tu ouvres un JOptionPane hors de l'EDT, donc ca peut poser des problèmes + ou - aléatoires.

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 10h00
  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, 12h28
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 14h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 16h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 14h53

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