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 :

Implémenter java.lang.Runnable ? Exemple plz


Sujet :

EDT/SwingWorker Java

  1. #1
    En attente de confirmation mail
    Inscrit en
    Février 2007
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 162
    Points : 72
    Points
    72
    Par défaut Implémenter java.lang.Runnable ? Exemple plz
    Bonjour a tous, je débute en java et j'ais une application qui quand elle se lance execute plusiseurs longues taches avant d'être au repos.

    Le problème c'est que ma jframe ne s'affiche q'une fois que mes longues fontions sont terminées alors que mes longues taches mettent à jours des labels et que j'aimerais voir la mise à jour des labels.

    J'ai donc été voir dans la fac pour voir ce qu'il y avait sur les threads.
    J'ai vu qu'il y avait la possiblité de mettre un thread dans une même classe sans avoir à en faire 2 en implémentant java.lang.Runnable.
    Mais le problème c'est que la fac ne fait que citer cette option et ne la développe pas...

    J'aimerais donc savoir comment faire !

    PS : Voici la forme de ma classe :


    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
     
    public class majframe extends javax.swing.JFrame {
     
        /** Creates new form frame_recherche_hd */
        public majframe(frame_main frame) {
            gui_accueil = frame;  
     
    		initComponents();
    		//On initialize la langue
            initLanguage();
    		//On initialize les options
            initOptions();
            //On rend la frame visible
            this.setVisible(true);
     
     
    		/***********************
                    Comment lancer les 2 fonctions suivantes dans un thread ?
                    ********************/
            MaGrosseFonctionLongue1();
            MaGrosseFonctionLongue2();
    		/***********************
                    Comment lancer les 2 fonctions précédentes dans un thread ?
                    ********************/
     
     
        }
     
        private void MaGrosseFonctionLongue1(){
            ....
        }
     
        private void initOptions(){
            ....
        }
     
     
     
     
        private void MaGrosseFonctionLongue2(){
            ....
        }                                       
     
     
     
        private void initLanguage(){
            ....
        }
     
     
    	/** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        // <editor-fold defaultstate="collapsed" desc=" Generated Code ">                          
        private void initComponents() {
            .... //GENERE PAR NETBEANS
        }// </editor-fold>                        
     
     
     
        private frame_main gui_accueil;
        // Variables declaration - do not modify                     
        private javax.swing.JButton bt_cancel;
        private javax.swing.JButton bt_ok;
    	.....
     
        // End of variables declaration                   
     
    }

    Je vous remercis d'avance pour votre aide

    Le but final étant que ma Jframe se charge sans difficulté dès le début, que mes fonctions s'éxécute dans un thread sachant que dans ses fonctions des labels sont mis à jour et donc que la mise à jour des label soit visible en temps réel...

  2. #2
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    dans ta classe principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TraitementLong tl = new TraitementLong();
    tl.start();
    et le squelette de classe de traitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class TraitementLong implements Runnable{
       public void run(){
          // Les traitements qui sont longs.
       }
    }

  3. #3
    En attente de confirmation mail
    Inscrit en
    Février 2007
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 162
    Points : 72
    Points
    72
    Par défaut
    Comme il est marqué dans mon premier post, j'aimerais que tout soit dans UNE SEULE classe.

    Or ce que tu me propose c'est de scindé ma classe principale et mon thread ce que je ne veux pas.

    Merci d'avance.

  4. #4
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		/***********************
                    Comment lancer les 2 fonctions suivantes dans un thread ?
                    ********************/
            MaGrosseFonctionLongue1();
            MaGrosseFonctionLongue2();
    		/***********************
                    Comment lancer les 2 fonctions précédentes dans un thread ?
                    ********************/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    new Thread(new Runnable() {
        @Override
        public void run() {
            MaGrosseFonctionLongue1();
            MaGrosseFonctionLongue2();
            //ces fonctions ne doivent pas modifier l'interface graphique ! (sinon il faut faire les actions dans l'EDT)
        }
    }).start();
    Sinon au niveau de la conception, c'est mieux d'avoir plusieurs classes, là tu mélanges les traitements, le modèle, la vue...

  5. #5
    En attente de confirmation mail
    Inscrit en
    Février 2007
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 162
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par ®om
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    new Thread(new Runnable() {
        @Override
        public void run() {
            MaGrosseFonctionLongue1();
            MaGrosseFonctionLongue2();
            //ces fonctions ne doivent pas modifier l'interface graphique ! (sinon il faut faire les actions dans l'EDT)
        }
    }).start();

    Qu'est ce que tu entends par "//ces fonctions ne doivent pas modifier l'interface graphique ! (sinon il faut faire les actions dans l'EDT)"
    Car dans mes fonctions j'ai le text de mes labels qui change...et si il faut le faire : comment ?


    "@Override" Est souligné comme une erreure sous netbeans, je l'ais donc enlevé ... c'est grave docteur ?

    Merci pour ton aide !

  6. #6
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par lex13
    Qu'est ce que tu entends par "//ces fonctions ne doivent pas modifier l'interface graphique ! (sinon il faut faire les actions dans l'EDT)"
    Car dans mes fonctions j'ai le text de mes labels qui change...
    À la fin de tes fonctions ou pendant tes fonctions?

    Tu peux englober tes setText(...) avec SwingUtilities.invokeLater( new Runnable() { });
    Ou alors utiliser SwingWorker, c'est plus propre :
    http://rom.developpez.com/java-swingworker

    Sinon pour des setText, ça n'est pas très grave, d'après la javadoc, c'est thread safe, moi je ne suis pas totalement d'accord, c'est ok pour l'exclusion mutuelle, mais ça n'est pas ok pour la mise en cohérence des caches...

    Citation Envoyé par lex13
    "@Override" Est souligné comme une erreure sous netbeans, je l'ais donc enlevé ... c'est grave docteur ?

    Merci pour ton aide !
    Non c'est pas grave, c'est parce que tu es sous java 5 et non java 6...

  7. #7
    En attente de confirmation mail
    Inscrit en
    Février 2007
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 162
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par ®om
    À la fin de tes fonctions ou pendant tes fonctions?

    Tu peux englober tes setText(...) avec SwingUtilities.invokeLater( new Runnable() { });
    Ou alors utiliser SwingWorker, c'est plus propre :
    http://rom.developpez.com/java-swingworker
    pendant mes fonctions...


    PS : j'ai tout un tas d'erreur si j'utilise cette méthode :


    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
    32
    33
    34
    35
    36
     
    Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 24, Size: 24
            at java.util.ArrayList.RangeCheck(ArrayList.java:547)
            at java.util.ArrayList.get(ArrayList.java:322)
            at dtek.SpecialTableModel.getValueAt(SpecialTableModel.java:58)
            at org.jdesktop.swingx.JXTable.getValueAt(JXTable.java:1292)
            at javax.swing.JTable.prepareRenderer(JTable.java:5652)
            at org.jdesktop.swingx.JXTable.prepareRenderer(JXTable.java:3285)
            at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:2067)
            at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1969)
            at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1765)
            at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
            at javax.swing.JComponent.paintComponent(JComponent.java:758)
            at javax.swing.JComponent.paint(JComponent.java:1022)
            at javax.swing.JComponent.paintChildren(JComponent.java:859)
            at javax.swing.JComponent.paint(JComponent.java:1031)
            at javax.swing.JViewport.paint(JViewport.java:747)
            at javax.swing.JComponent.paintChildren(JComponent.java:859)
            at javax.swing.JComponent.paint(JComponent.java:1031)
            at javax.swing.JComponent.paintToOffscreen(JComponent.java:5104)
            at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:285)
            at javax.swing.RepaintManager.paint(RepaintManager.java:1128)
            at javax.swing.JComponent._paintImmediately(JComponent.java:5052)
            at javax.swing.JComponent.paintImmediately(JComponent.java:4862)
            at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:723)
            at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:679)
            at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:659)
            at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
            at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
            at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
            at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
            at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
            at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
            at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

  8. #8
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Ton table model il va chercher les données dans un tableau qui est modifié par tes fonctions longues?

  9. #9
    En attente de confirmation mail
    Inscrit en
    Février 2007
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 162
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par ®om
    Ton table model il va chercher les données dans un tableau qui est modifié par tes fonctions longues?

    En fait dans mes fonctions longues, je traite un arraylist (lecture des lignes, modification de ligne) qui sert de tablemodel pour ma jxtable.

    Les labels de ma jframe sont modifiés en conséquences

  10. #10
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    OK il ne faut pas modifier le modèle à partir d'un autre thread...

    Voici un petit tuto que j'ai écrit sur les modèles de jlist et le multi-threading, c'est pareil pour les jtable:
    http://rom.developpez.com/java-swingui-models.pdf

  11. #11
    En attente de confirmation mail
    Inscrit en
    Février 2007
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 162
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par ®om
    OK il ne faut pas modifier le modèle à partir d'un autre thread...

    Voici un petit tuto que j'ai écris sur les modèles de jlist et le multi-threading, c'est pareil pour les jtable:
    http://rom.developpez.com/java-swingui-models.pdf
    Ouuuuuuuuffffff
    Ca à l'air super compliqué ce truc... Je crois que j'ais pas le choix de toute façon...

    Edit : Et ya pas un moyen de faire en sorte que ma jframe s'affiche totalement avant de commencer les taches longues sans mettre les taches longues dans un autre thread ?
    (pour l'instant ça freeze tant que la tache longue n'est pas terminée)

  12. #12
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par lex13
    Edit : Et ya pas un moyen de faire en sorte que ma jframe s'affiche totalement avant de commencer les taches longues sans mettre les taches longues dans un autre thread ?
    (pour l'instant ça freeze tant que la tache longue n'est pas terminée)
    Non, c'est normal:
    http://gfx.developpez.com/tutoriel/j...wing-threading

  13. #13
    En attente de confirmation mail
    Inscrit en
    Février 2007
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 162
    Points : 72
    Points
    72
    Par défaut
    La solution serait peut-etre de changer le model de ma jxtable le temps du long traitement et une fois qu'il a finit on remet l'ancien model ! Je teste ça

  14. #14
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par lex13
    La solution serait peut-etre de changer le model de ma jxtable le temps du long traitement et une fois qu'il a finit on remet l'ancien model ! Je teste ça
    Si tu ne veux pas que tes données se mettent à jour au fur et à mesure du traitement long, il suffit que ton traitement long ne modifie pas la liste du modèle de ta jtable, oui !

    Ne change pas le modèle pour faire le traitement long, fait simplement le traitement long sur une autre liste, que tu affectes une fois terminé au modèle...

  15. #15
    En attente de confirmation mail
    Inscrit en
    Février 2007
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 162
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par ®om
    Si tu ne veux pas que tes données se mettent à jour au fur et à mesure du traitement long, il suffit que ton traitement long ne modifie pas la liste du modèle de ta jtable, oui !

    Ne change pas le modèle pour faire le traitement long, fait simplement le traitement long sur une autre liste, que tu affectes une fois terminé au modèle...
    C'est pas une mauvaise idée, mais bon vu que mes arraylist peuvent avoir plusieurs milliers de lignes, je n'ais pas vraiment envie de dupliquer les données...ça prendrais un peu trop de place dans la ram

    Sinon la solution marche, j'ai testé
    Une solution plus propre serait tout de même de pouvoir désactiver les listenner qui font que à chaque modification de mon arraylist, cela ne mette pas à jour ma jxtable....
    Vous avez une idée de comment faire ça ?

  16. #16
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par lex13
    C'est pas une mauvaise idée, mais bon vu que mes arraylist peuvent avoir plusieurs milliers de lignes, je n'ais pas vraiment envie de dupliquer les données...ça prendrais un peu trop de place dans la ram
    Tu as juste à affecter le pointeur une fois terminé... ça prend 4 octets lol
    Citation Envoyé par lex13
    Une solution plus propre serait tout de même de pouvoir désactiver les listenner qui font que à chaque modification de mon arraylist, cela ne mette pas à jour ma jxtable....
    Vous avez une idée de comment faire ça ?
    Ça serait incorrect, car ta table aurait un accès à un modèle dont ses indices (début et fin...) seraient erronés. Et l'accès au modèle ne se fait pas que quand le modèle est modifié, mais aussi quand ta fenêtre est redessinée (déplacement, ou quand une fenêtre passe par dessus...).

  17. #17
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Ben ce qu'il te proposait ne voulait pas dire dupliquer l'arraylist ... il te propose simplement d'affecter l'intégralité de l'arraylist à la fin !

    Sinon, "désactiver" la notification de la vue au changement du modèle c'est vraiment pas propre du tout... Honnetement, la solution de l'affectation à la fin est nettement plus propre, et tres simple

  18. #18
    En attente de confirmation mail
    Inscrit en
    Février 2007
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 162
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par ®om
    Ne change pas le modèle pour faire le traitement long, fait simplement le traitement long sur une autre liste, que tu affectes une fois terminé au modèle...

    Citation Envoyé par ®om
    Tu as juste à affecter le pointeur une fois terminé... ça prend 4 octets lol
    Euh je ne comprends pas comment faire le traitement sur une autre liste si je ne duplique pas l'existante ? Par ce que dans mes traitements long, je modifie ajoute/ enlève des lignes de mon arraylist existante.

    C'est quoi cette histoire de pointeur ?


    Citation Envoyé par chtig
    Ben ce qu'il te proposait ne voulait pas dire dupliquer l'arraylist ... il te propose simplement d'affecter l'intégralité de l'arraylist à la fin !
    Idem je ne comprends pas... je dois effectuer des modifications sur l'arraylist actuelle donc je dois bien dupliquer l'arraylist pour faire des modifications sur la nouvelle qui n'est pas prit comme modèle...et ensuite écraser l'ancienne arraylist par la nouvelle modifiée...

    Vous feriez ça comment vous ?

  19. #19
    En attente de confirmation mail
    Inscrit en
    Février 2007
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 162
    Points : 72
    Points
    72
    Par défaut
    up

  20. #20
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    De ce que tu nous montrait de ton code, j'avais compris que les traitements longs correspondaient à l'initialisation du modèle. Je me trompe ? C'est aussi des mises à jour ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. java.lang.NoClassDefFoundError sur un exemple tout simple
    Par Invité dans le forum Services Web
    Réponses: 2
    Dernier message: 23/02/2009, 11h36
  2. Réponses: 5
    Dernier message: 22/08/2007, 23h00
  3. Comment faire pour Implémenter java.lang.Runnable
    Par je®ome dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 10/05/2006, 14h17
  4. [IMAGE JAI] java.lang.Error
    Par babyboy dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 18/05/2004, 15h29
  5. Réponses: 4
    Dernier message: 22/01/2004, 09h27

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