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 :

Auto refresh d'une JTable sur Jinternal JDK1.5


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Par défaut Auto refresh d'une JTable sur Jinternal JDK1.5
    Bonjours,

    Je sèche depuis plusieur jours sur un problème thread en JDK 1.5 et je voudrais bien le faire avec Thread ou runnable sans utiliser la classe Swingworker et ce pour bien comprendre les Threads.

    Dans une JInternalFrame qui display un tableau resultat d'un SQL, je souhaite activer une fonction auto refresh.

    Probleme un : il peut exister plusieur occurence de ce JInternal frame qui pointent chacune sur une DB differente.

    Probleme deux : j'ai suivit le tutorial Thread gfx, lu ce forum mais mon code bloque mon interface. Je cherche l'erreur mais je ne la vois pas:

    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
     
     
     
     
    public class frame_streams_configuration extends JInternalFrame implements ActionListener {
     
    // Ne devrais pas declarer private static ? Attention car j'ai plusieures occurences de JTable ? 
     
     private Jtable_sort ts_apply; 
     private JFormattedTextField tfAutoApp;   //  Formated TF sera restreint aux entiers
     
    .
    .
    .
     
    // la fonction actionlistener :
     
        public void actionPerformed(ActionEvent e) {
             if (e.getSource().equals(jbExportDataDict)) {  // un autre objet
                   do_jbExportDataDict();  
     
             } else if (e.getSource().equals(tfAutoApp)) {       
                   do_autoRefreshApp(); // la ligne qui nous interresse
         .
         .
         .
        }
     
        private void do_autoRefreshApp() {
            if ( tfAutoApp.getText().length() > 0 ) {
                threadApp = new Thread(new Runnable()   {
                      public void run() {    
                             SwingUtilities.invokeLater(new Runnable(){
                                             public void run(){
                                                    cpt=0;
                                                    while (tfAutoApp.getText().length() > 0) {
                                                    try {
                                                        populate_apply();
                                                    } catch (SQLException e) {
                                                        System.out.println("C1:="+e);
                                                    }
                                                    try {
                                                        Thread.sleep(2000) ;
                                                    } catch (InterruptedException e) {
                                                        System.out.println("Catch:="+e);
                                                    }
                                                    System.out.println("After sleep cpt="+ ++cpt);
                                                }
                                       }    
                                });
                              System.out.println("Thread Done"+cpt);
                              }
                } ); // end thread
                threadApp.start();
            }
        }
    Des que je met une valeur dans auto je vois bien que le tread demarre, mais je n'ai plus la main sur mon interface. Pourtant j'utilise bien 2 runnable et invokelater. je fait appel a la fonction populate_apply dans invokeLater alors ou est le bug?


    La fonction Populate_apply:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
        private void populate_apply() throws SQLException {
     
            if (ts_apply == null){
                ts_apply = new Jtable_sort(conn,"",12);   // Creer Obejct JTable et lui associe un SQL et avec un connection Oracle
               .
               .
            }
             Vector data = ts_apply.run_sql(conn, "select ... from table... " );
              if ( data != null){
                   ts_apply.model.getDataVector().clear();
                   ts_apply.model.setDataVector(data,ts_apply.columnNames);
             }

    Autre le fait que mon interface ce bloque, je me demande si a chaque call de populate_apply, je ne cree pas une nouvelle occurence de ma table ts_apply.
    Et je ne suis pas satisfait du tout de ma declaration du thread: Des qu'on met la vameur du JFormattedText 'tfAutoApp' a 0, le Thread doit s'arreter.

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Ta requête ne dois surtout pas être invoquée dans le SwingUtilities.invokeLater (relis le tuto de gfx, il est très clair sur ce point).

    Il faut que la requête soit exécutée dans le thread mais pas dans le SwingUtilities.invokeLater.

    La méthode SwingUtilities.invokeLater ne doit contenir que des appels en relation avec les composants graphiques, rien d'autre.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Par défaut
    Tu as raison, je suis un authentique crabe des Andes Méridonales.

    J'ai sorti le Tread.sleep de invokeLater et tout marche merveilleusement bien : je me bloquais moi-meme.
    Ce simple code modifié me permet maintenant de creer des sous fenetre avec graphiques qui s'auto rafraichissent, genre performance manager de windows avec plusieurs CPU.

    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
     
        private void do_autoRefreshApp() {
            System.out.println("change detected in tfAutoApp");
            if ( tfAutoApp.getText().length() > 0 ) {
                System.out.println("Defining Thread="+tfAutoApp.getText());
                threadApp = new Thread(new Runnable()   {
                      public void run() {    
                             System.out.println("Thread Started!");
                             cpt=0;
                             while (tfAutoApp.getText().length() > 0) {
                                    SwingUtilities.invokeLater(new Runnable(){
                                             public void run(){
                                                    try {
                                                        populate_apply();
                                                    } catch (SQLException e) {
                                                        System.out.println("C1:="+e);
                                                    }
     
                                                }
                                       });
                                      System.out.println("After invoke later="+ ++cpt); 
                                    try {
                                        Thread.sleep(2000) ;                 // Bougé host de invokeLater
                                    } catch (InterruptedException e) {
                                        System.out.println("Catch:="+e);
                                    }
     
                                }
                              System.out.println("Thread Done"+cpt);
                              }
                } ); // end thread
                threadApp.start();
            }
        }
    Probleme résolu et le crabe a la casserole !

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

Discussions similaires

  1. Refresh d'une Jtable
    Par delta07 dans le forum Composants
    Réponses: 3
    Dernier message: 08/01/2015, 16h29
  2. Afficher une Jtable sur une JPanel
    Par moufasa dans le forum Débuter
    Réponses: 3
    Dernier message: 06/04/2009, 17h39
  3. refresh d'une jtable a l'interieur d'un panel
    Par thomas1509 dans le forum Composants
    Réponses: 2
    Dernier message: 17/01/2008, 14h29
  4. programmer le bouton refresh sur une jtable
    Par henpower dans le forum Composants
    Réponses: 5
    Dernier message: 07/09/2007, 15h37
  5. Problème de refresh dans une JTable
    Par vano dans le forum Composants
    Réponses: 3
    Dernier message: 04/05/2006, 15h57

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