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

Composants Java Discussion :

[thread] Rafraichissement JLabel


Sujet :

Composants Java

  1. #1
    Membre habitué
    Inscrit en
    Mars 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 11
    Par défaut [thread] Rafraichissement JLabel
    Bonjour a tous.

    Je possede une classe dont les methodes realisent de lourds traitements sur des bases de donnees.
    Je suis en train de realiser l'interface graphique (JFrame) qui lance ce traitement.
    Comme celui-ci est long, je voudrais afficher dans un JLabel, ce que le traitement est en train de faire.
    Le probleme est que je n 'arrive pas a rafraichir mon JLabel, cela ne s affiche qu une fois le traitement termine.

    Apres avoir cherche sur le forum, il me semble que je dois placer le gros traitement a l interieur d un thread.

    Ce que je ne sais pas faire, est le rafraichissement de l'interface a partir du thread de traitement (puisque c'est lui qui indique ce qu'il est en train de faire), et non pas a partir de l'interface (ce sur quoi j'ai trouve de nombreux posts ici meme).

    J espere que j'ai reussi a me faire comprendre.

    Merci beaucoup pour votre aide

    Astyanax34

  2. #2
    Membre éprouvé
    Avatar de narkotik
    Inscrit en
    Mai 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 117
    Par défaut
    dans tes attributs de JFrame(qu'on appelera ici Z), rajoutes ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RenderingThread render;
    dans le constructeur de ta JFrame, rajoutes ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    render = new RenderingThread(this);
    render.start();
    créés une classe RenderingThread en + :

    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
     
    class RenderingThread extends Thread  
    {
       Z essai;
     
       public RenderingThread(Z essai)
       {
           this.essai=essai;
       }
       public void run() 
       {
            while(true) 
            { 
                 essai.repaint(); 
                 try { sleep(100) } catch (Exception e) {}
            }
        }
    }

  3. #3
    Membre habitué
    Inscrit en
    Mars 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 11
    Par défaut
    Merci beaucoup !
    Ca marche tres bien.

    Par contre maintenant j'ai deux autres problemes.
    Un petit: le pointeur de la souris scintille (Apparement selon la duree du wait). J ai donc mis 10 sec au lieu de 1/10 de sec, le scintillement m'est plus genant et ca marche toujours, mais c'est pas tres propre.
    Y a t il une autre methode?

    Par contre, mon autre probleme est plus important.
    Il est apparu lorsque j ai transforme ma classe de traitement des donnees en Thread.
    En effet, les methodes de cette classe lancaient des exceptions.
    Je recuperais ces exceptions dans l'interface pour afficher des messages d'erreur.
    Maintenant que la classe derive de Thread, je ne peux plus lancer mes exceptions. En effet, le compilateur me dit que la surcharge de la methode run() ne permet pas de lancer des exceptions, lorsque je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void run() throws Exception
    Quelqu'un sait il comment je peu faire?

    Merci encore

    Astyanax34

  4. #4
    Membre éprouvé
    Avatar de narkotik
    Inscrit en
    Mai 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 117
    Par défaut
    bon c'est cool si le rafraichissement marche, j'pense pas que pour ce que tu fais il y ait de meilleure méthode, enfin j'peux me tromper
    pour ton probleme avec ton Throws pourquoi ne mets tu pas plutot des try//catch ?

  5. #5
    Membre habitué
    Inscrit en
    Mars 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 11
    Par défaut
    Hello,

    En fait, je faisais de cette maniere car la classe de traitement peux etre executee sans interface, je traitais donc l affichage des erreurs dans la code de la Frame, c'est pour cela que je generais des exceptions.
    Mais maintenant, le code a change, et la fenetre est un parametre (qui peut etre null) de la classe de traitement, je peux donc essayer de changer ma maniere de faire et que ce soit elle qui affiche, s'il le faur les messages des errors, donc changer les blocs Try//catch de place!

    Merci tu m as fait ouvrir les yeux.

    Je reposterai si ca ne marche pas.

    N'as tu pas une idee en ce qui concerne le clignotement du pointeur de souris?

    Merci

    Astyanax34

  6. #6
    Membre éprouvé
    Avatar de narkotik
    Inscrit en
    Mai 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 117
    Par défaut
    c'est un curseur de souris personnalisé ou un de base ?

  7. #7
    Membre habitué
    Inscrit en
    Mars 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 11
    Par défaut
    un de base, tout ce qui a de plus simple

  8. #8
    Membre éprouvé
    Avatar de narkotik
    Inscrit en
    Mai 2004
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 117
    Par défaut
    bizarre, ca ne devrait pas le faire

  9. #9
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    Dans les règles de l'art, aucun traitement ne doit communiquer avec l'interface directement. Pour celà, il "notifie" au moyens d'évènements.

    Pour assembler le tout, l'interface lance le traitement dans un Thread et s'abonne a ses évènements.

    Le problème de Swing c'est qu'il est mono thread. C'est pour celà que ton traitement doit être lancé dans un thread a part.

    Imaginons ta classe et ta méthode qui prend du temps comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class BusinessClass {
       public void traitementLong() {
          // fait QQchose de long...
       }
    }
    Le problème, c'est que les traitement de ce type son rarement dérivé de la classe Thread. Donc, le principe est de créer un thread d'execution et de lancer ta classe dedans comme suit (ici dans un bouton par exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      public void actionPerformed(ActionEvent e) {
        final BusinessClass maClasse = new BusinessClass();
        Thread t = new Thread() {
          public void run() {
            maClasse.start();
          }
        }
      }
    Ainsi le bouton rend la main à Swing imédiatement alors que ton travail commence.

    PS: Ton scintillement est probablement du a des repaint().

  10. #10
    Membre habitué
    Inscrit en
    Mars 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 11
    Par défaut
    Laisse tomber c'est pas tres grave puisqu il suffit de mettre une grande valeur dans le wait pour que ca ne scintille que tres peu (1 scintillement tous les 20 secondes c'est suportable )

    Pour mon autre probleme, c'est arrange , j ai fait comme dit plus haut.

    Merci pour ton aide.

    A bientot

    Astyanax34

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    Pour info, si tu garde la solution du Thread qui fait des repaint, passe le au moins en daemon afin de ne pas bloquer la sortie de la VM.
    C'est plus propre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.setDaemon(true); // dans le constructeur du Thread
    Assure toi aussi de ne pas forcer de repaint inutile si le JFrame n'est pas visible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if( essai.isVisible()  )
       essai.repaint();

  12. #12
    Membre habitué
    Inscrit en
    Mars 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 11
    Par défaut
    Merci beaucoup pour ces conseils, je vais rajouter ca de suite.

    A+

    Astyanax34

  13. #13
    Membre habitué
    Inscrit en
    Mars 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 11
    Par défaut
    Alwin, je n'avais pas vu ton premier post d'hier, je n'ai donc pas teste ta methode qui parait plus propre. Je n'ai pas le temps de recommencer, mais je note tes conseils pour plus tard.
    Cependant, sans avoir teste, il y a un petit truc qui minterpelle:
    je ne comprend pas comment tu peux faire
    alors que maClasse est une instance de BusinessClass, qui ne derive pas de Thread.
    J ai bien note que tu faisais cela dans le coprs d'un thread, mais je ne comprend toujours pas.
    Peux tu m'apporter une petite explication stp.

    Merci beaucoup

    Astyanax34

  14. #14
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Par défaut
    oui, tu a raison, c'est maClasse.traitementLong();
    et après la création du Thread, t.start();

    Méa culpa, PHPbb n'as pas encore de correcteur de syntaxe java

  15. #15
    Membre habitué
    Inscrit en
    Mars 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 11
    Par défaut
    Merci!

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/03/2011, 10h01
  2. [JPanel][JLabel] rafraichissement et threads
    Par zaboug dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 17/05/2010, 11h09
  3. Réponses: 2
    Dernier message: 04/06/2008, 17h27
  4. threads & rafraichissement d'affichage
    Par Pancake dans le forum EDT/SwingWorker
    Réponses: 3
    Dernier message: 18/01/2008, 15h51
  5. [MFC] CFormView, Thread et rafraichissement
    Par Philippe299 dans le forum MFC
    Réponses: 6
    Dernier message: 08/09/2005, 16h18

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