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 :

prévenir utilisateur début / fin de traitement


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre régulier
    Homme Profil pro
    Dévelopeur Cobol + Java J2SE
    Inscrit en
    Novembre 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dévelopeur Cobol + Java J2SE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 72
    Points : 77
    Points
    77
    Par défaut prévenir utilisateur début / fin de traitement
    bonjour, je voudrais modifier le comportement de mon appli standalone.
    Quand traitement() s'exécute, le curseur reste là où il est (quelque part dans un jtextfield ou une jtable), l'écran se "fige" un court instant puis le nouvel écran apparaît (la méthode fait 1 ou 2 accès bases, instancie un jpanel ..). Ce comportement me va très bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    jframe.getJLabelEtoile().setText("X");
    traitement();
    jpanel.getJLabelEtoile().setText(" ");
    jframe.repaint();
    Je voudrais juste que l'utilisateur voie le "X" s'afficher (ce qui n'est pas le cas actuellement, on ne le voit jamais) afin qu'il sache que son action a bien été prise en compte, que ce n'est pas la peine qu'il refasse une action. Mais en gardant l'écran figé comme actuellement, car dans cette partie de l'application ce n'est pas grave, et j'ai une gestion du positionnement curseur qui a été très compliquée à mettre en place, je devrais tout rechanger si l'écran ne restait plus figé.
    J'ai une autre partie de l'appli où je fais un swingworker avec un écran d'attente, mais le comportement ne me satisfait pas dans ce nouveau cas.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Donc tu veux figer l'écran, sans figer l'écran? Ce n'est pas possible. De toutes façons, faire un traitement long dans l'EDT c'est une mauvaise pratique. Donc tu retire le traitement long de ton EDT et tu passe par un SwingWorker.

  3. #3
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par tchize_ Voir le message
    Donc tu veux figer l'écran, sans figer l'écran? Ce n'est pas possible. De toutes façons, faire un traitement long dans l'EDT c'est une mauvaise pratique. Donc tu retire le traitement long de ton EDT et tu passe par un SwingWorker.
    +1


    Surtout que c'est assez facile à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    		jframe.getJLabelEtoile().setText("X");
    		new SwingWorker<Void, Void>() {
    			@Override
    			protected Void doInBackground() throws Exception {
    				traitement();
    				return null;
    			}
    			protected void done() {
    				jframe.getJLabelEtoile().setText("");
    			}
    		}.execute();

    a++

  4. #4
    Membre régulier
    Homme Profil pro
    Dévelopeur Cobol + Java J2SE
    Inscrit en
    Novembre 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dévelopeur Cobol + Java J2SE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 72
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    +1


    Surtout que c'est assez facile à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    		jframe.getJLabelEtoile().setText("X");
    		new SwingWorker<Void, Void>() {
    			@Override
    			protected Void doInBackground() throws Exception {
    				traitement();
    				return null;
    			}
    			protected void done() {
    				jframe.getJLabelEtoile().setText("");
    			}
    		}.execute();

    a++
    merci, actuellement dans traitement() je modifie le contenu de jframe, puis je fais un repaint() à la fin.
    Est ce que je laisse le repaint() à la fin de traitement() ou je dois le mettre ailleurs ?

  5. #5
    Membre habitué
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 86
    Points : 174
    Points
    174
    Par défaut
    Bonjour,

    Citation Envoyé par CobolProgrammator Voir le message
    Est ce que je laisse le repaint() à la fin de traitement() ou je dois le mettre ailleurs ?
    La méthode repaint() agit sur ta vue, elle va la redessiner donc c'est une opération à faire dans l'EDT. La méthode done() s'exécute dans l'EDT une fois que le traitement (effectué par doInBackground) est terminé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    		jframe.getJLabelEtoile().setText("X");
    		new SwingWorker<Void, Void>() {
    			@Override
    			protected Void doInBackground() throws Exception {
    				traitement();
    				return null;
    			}
    			protected void done() {
    				jframe.getJLabelEtoile().setText("");
                                    jframe.repaint();
    			}
    		}.execute();
    Pour plus d'information : http://rom.developpez.com/java-swingworker/
    Si mon message t'a aidé, un petit ne fera pas de mal
    Pensez aussi à

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Les modifications de la frame sont à faire dans l'EDT, via, par exemple, la méthode done() du SwingWorker à la fin.

    Si tu a besoin de mettre des composants à jour pendant le traitement, tu le faire avec un SwingUtilities.invokeLater ou invokeAndWait.

  7. #7
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Si tu a besoin de mettre des composants à jour pendant le traitement, tu le faire avec un SwingUtilities.invokeLater ou invokeAndWait.
    Ou via les méthodes publish()/process() du SwingWorker, qui sont faites pour cela



    a++

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Oui, si toutes tes opérations intermédiaires peuvent se mettre sous forme de datas. Quand c'est plus complexe (genre à ce moment si il faut afficher une fenetre, là on supprime tel composant, etc), je trouve moche de devoir avoir recours à un SwingWorker<?,Runnable>

  9. #9
    Membre régulier
    Homme Profil pro
    Dévelopeur Cobol + Java J2SE
    Inscrit en
    Novembre 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dévelopeur Cobol + Java J2SE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 72
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Ou via les méthodes publish()/process() du SwingWorker, qui sont faites pour cela



    a++
    Merci pour vos réponses, malheureusement pas eu le temps de bosser dessus encore.
    Petite question, dans traitement(), un publish() peut il me servir si je veux setter la couleur d un composant en rouge par exemple, mais que je veux que ça ne se voie à l'écran que quand traitement() est fini (en gros au moment du done(), dans lequel je fais mon repaint()) ?

  10. #10
    Membre régulier
    Homme Profil pro
    Dévelopeur Cobol + Java J2SE
    Inscrit en
    Novembre 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dévelopeur Cobol + Java J2SE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 72
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par CobolProgrammator Voir le message
    Merci pour vos réponses, malheureusement pas eu le temps de bosser dessus encore.
    Petite question, dans traitement(), un publish() peut il me servir si je veux setter la couleur d un composant en rouge par exemple, mais que je veux que ça ne se voie à l'écran que quand traitement() est fini (en gros au moment du done(), dans lequel je fais mon repaint()) ?
    Bon, apparemment pas possible que les champs modifiés dans le traitement() apparaissent ensembles à la fin et pas au fur et à mesure.
    Je me suis débrouillé pour ça.
    Pour le reste oui vos réponses m'ont été utiles, ça marche bien maintenant, je peux bien afficher ma croix et elle disparait à la fin du traitement (j'ai même rajouté le temps passé en secondes). Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Traitement récursif dates début/fin
    Par laloune dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 03/04/2012, 10h41
  2. Rapport/Sous-Rapport - faire passer dates début/fin
    Par nmicoud dans le forum iReport
    Réponses: 0
    Dernier message: 08/02/2008, 16h24
  3. Curseur sablier ne change qu'en fin de traitement
    Par allex2108 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/08/2007, 14h26
  4. jProgressBar ne progresse qu'a la fin du traitement
    Par lhpp dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 26/04/2007, 16h16
  5. Recherche entre 2 dates (début/fin)
    Par Julien42 dans le forum Access
    Réponses: 4
    Dernier message: 11/01/2007, 11h33

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