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 :

Retour valeur SwingUtilities.invokeLater


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 136
    Par défaut Retour valeur SwingUtilities.invokeLater
    Bonjour,

    Voici mon problème: j'ai un traitement long que j'effectue dans un "SwingUtilities.invokeLater". Ce traitementparcourt une base de donnée. Le résultat de cette opération doit avoir une influence sur mon interface (mise en valeur de certains endroits sur une image). J'ai donc besoin de "récuperer" le resultat de ce traitement, et c'est la que j'echou.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    	private checkErrors checkErrors (String number) {
    		errors fsp = null;
    		final String nr = number;
    		SwingUtilities.invokeLater(new Runnable(){
    			public void run(){		
    				fsp = new checkErrors(nr);
    			}
    		});
     
    		return fsp;
    	}
    Avec le code que j'ai actuellement lors du premier appel, null est retourné. Je présume que mon opération de calcul n'est pas finit, avant que le return soit effectué. Mais je ne vois pas comment recuperer fsp uniquement quand l'operation est accomplie, ou du moins faire en sorte que fsp soit "de nouveau retourné" a la fin de l'operation longue, sans pour autant que mon interface se fige.. Quelqu'un aurait une idée ?

    Merci d'avance

    Cordialement

  2. #2
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Alors premièrement il y a une grosse confusion : il ne faut pas faire le traitement long dans le cadre du invokeLater, mais à l'extérieur, dans un autre thread !

    Ici tu devrais lancer un thread simple, et à la fin seulement de ce thread, faire un invokeLater avec les données récupérées, et ça donnerait qqchose comme :

    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
    Thread t = new Thread(new Runnable())
    {
     public void run()
     {
       final ClasseVal val = checkVachementLong();
       SwingUtilities.invokeLater(new Runnable()
       {
        public void run()
        {
         affichageSwingDansLeEDT(val);
        }
       });
     }
    }
    t.start();
    Ou alors, evidemment, tu utilises un SwingWorker.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 136
    Par défaut
    Bonjour,

    Merci pour ta réponse. En effet, il y avait une confusion de ma part pour les invokeLater. J'avais aussi pensé à faire ca avec un swingworker, mais j'avais le meme probleme.
    Ci-joint mon code ( Jre 1.4 )
    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
     
     
    	private checkErrors checkErrors (String number) {	
    		Errors fsp = null;
    		new SwingWorker() {			 
    			public Object construct() {
    				fsp = new Errors(number);
    				return null;
    			}
     
    			public void finished() {
    				repaint();
    			}
    			}.start(); 
    		return fsp;
    	}
    Je ne trouve pas la facon de faire pour récuperer mon objet, une fois le traitement dans construct() effectué. Ma question est sans doute un peu bete, mais je suis bloqué sachant qu'avec le code actuel, fsp est toujours null. Si quelqu'un a une idée

    Cordialement

  4. #4
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Avec le 1.4 je sais pas. À voir ton code - dont je m'étonne qu'il compile, mais enfin peut être que je me souviens plus de trucs en 1.4 -, il faudrait que tu disposes au moins d'une variable associée au SwingWorker pour récupérer une éventuelle valeur d'une de ses méthodes. Là c'est plus du swing, il faut voir le langage et la doc.

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 136
    Par défaut
    Pourtant il compile tout a fait mon code :S
    Je vais continuer de voir si je trouve quelque chose en documentation. En tout cas merci pour ton aide.

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 136
    Par défaut
    Est-ce que quelqu'un saurait comment faire ca avec une JRE > 1.4 ? Ca pourrait m'aider a orienter mes recherches. Merci

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,



    Ton problème vient du fait que tu as une logique séquentielle, alors qu'une application graphique a une logique événementielle.




    En gros les actions sur l'interface devrait devrait se décomposer en deux étapes :
    • Mise à jour de l'interface AVANT l'exécution de l'action si besoin (par exemple grisé le bouton pour qu'il ne soit pas cliquer deux fois, afficher une progressbar ou autres, ...).
    • Création et exécution du SwingWorker qui executera les traitements.
      Ce dernier se découpant en au moins deux parties :
      • doInBackground() (ou construct() pour la classe compatible 1.4) qui contient le traitement "lourd" qui sera exécuté en tâche de fond. Cette méthode peut éventuellement retourner un résultat.
      • done() (ou finished()) qui sera exécuté dans l'EDT seulement lorsque la méthode précédente sera terminé. On peut utilisé get() pour récupérer le résultat et mettre à jours l'affichage comme bon nous semble : mise à jours des données, réactivation du bouton ou suppression de la progressbar, etc.



    a++

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 136
    Par défaut
    Merci pour ta réponse adiGuba, mais je dois t'avouer que je n'ai pas encore trouvé une solution qui me convenait a 100% En fait, je m'imagine quelque chose comme ca :

    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
     
    	private Errors checkErrors(String nr) {	
    		fsp = null;
    		new SwingWorker() {			 
    			public Object construct() {
    					fsp = new FehlerSchwerpunkte(nr);
    			}
     
    			public void finished() {
    				repaint();	
    			}
     
    			}.start(); 
    		return fsp;
    	}.
    En fait ce que je souhaiterai, c4est pouvoir faire quelque chose du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Errors err = checkErrors("123").get();
    // En attendant continuer a executer mon programme
    // Et quand le traitement long dans construct() est fini, 
    // que "err" récupère l'objet Errors crée. Mais avec le 
    // swingworker de java 1.4, je ne trouve pas d'equivalent
    // à get()
    Ce que je souhaite faire est peut-etre un peu naif, mais si c'est possible, ca m'arrangerait bien

    Merci d'avance

Discussions similaires

  1. Probleme retour valeur recordset
    Par Access Newbie dans le forum VBA Access
    Réponses: 5
    Dernier message: 30/07/2007, 12h37
  2. SwingUtilities.invokeLater casse mon redimensionnment
    Par Baptiste Wicht dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 01/06/2007, 11h42
  3. Réponses: 17
    Dernier message: 10/07/2006, 20h13
  4. surcharge+ et retour valeur
    Par maminova77 dans le forum C++
    Réponses: 14
    Dernier message: 29/04/2006, 20h31
  5. [PHP-JS] retour valeur javaScript dans php
    Par Tempotpo dans le forum Langage
    Réponses: 6
    Dernier message: 06/04/2006, 12h35

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