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

AWT/Swing Java Discussion :

jprogressbar sur ResultSet


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 193
    Par défaut jprogressbar sur ResultSet
    Bonjour!!

    Je voudrais savoir comment créer une Jprogressbar sur le contenu d'un ResultSet:

    L'idée est que j'affiche des données provenant d'une base de données et je voudrais que la barre avance en temps réel à chaque fois qu'il y a un nouvel enregistrement dans le ResultSet (sachant que je connais exactement le nobre d'enregistrement qu'on devrait avoir à la fin.

    N'hésitez pas à me demander plus d'explication si ce n'est pas clair!

    Merci pour votre aide!!

  2. #2
    Membre chevronné
    Avatar de Orian
    Inscrit en
    Août 2006
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Août 2006
    Messages : 372
    Par défaut
    Tu prend ta progressBar, tu lui met le nombre d'enregistrement en valeur maximale, 0 en minimale et tu fait +1 à chaque fois qu'un enregistrment est traité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    JProgressBar progress = new JProgressBar();
     
            progress.setMaximum(nbrRec);
            progress.setMinimum(0);
            // traitement de l'enregistrement
            progress.setValue(progress.getValue()+1);

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 193
    Par défaut
    Salut!

    J'ai suivi ton conseil mais la barre ne progresse que si j'enlève le test sur le traitement.

    Je t'envoie mon code avec la partie test en gras:si quelqu'un a une idée sur l'origine du problème n'hésitez pas. Merci bcp!!

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    
    package testt
    
    import javax.swing.*;
    import java.awt.*;
    import java.sql.DriverManager;
    import java.sql.*;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class test extends JFrame{
    JProgressBar b;
    
    public test(){
    super("ma barre");
    this.setBounds(200,200,200,50);
    b=new JProgressBar(0,50);
    this.getContentPane().add(b);
    this.setVisible(true);
    Thread t=new ThreadAvanceBarre(b);
    t.start();
    }
    
    
    public static void main(String args[]){
    new test();
    }
    //La classe qui correspond au thread pour faire avancer la barre	
    class ThreadAvanceBarre extends Thread {
    JProgressBar barre;
    
    
    public ThreadAvanceBarre(JProgressBar b){
    barre=b;
      
    }
    
    public void run(){
      
          // Charger le pilote Oracle
                try {
                  DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
          
                  // Connexion à la base de données
                  Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@127.0.0.1:1521:fegte", "user", "password");
          
                  // Requête SQL
                  //Création d'un objet requête
                  Statement stmt = conn.createStatement();
                  
              final Statement stmt1 = conn.createStatement();
                  //Envoyer la requête et récupérer le résulatat
                  ResultSet rset = stmt.executeQuery("select count(*) from fastpa where nolan=2");
          
                  // Affichage du résultat
                  while (rset.next()) {
                    
                    final String max = rset.getString(1);
                    
                    int maxx=Integer.parseInt(max);
          
                    System.out.println(max);
          
                    barre.setMaximum(maxx);
                    barre.setMinimum(0);
                    
                    
                      try {
                        //sleep(50);
                      }
                      catch (Exception e) {
                        System.err.println(e);
                      }
                      
                      /*** Traitement de test sur la Jprogressbar ***/
                      Timer minuteur = new Timer();
                      TimerTask tache = new TimerTask() {
                public void run()  {
                      //ResultSet rset1 = null;
                      try {
                      ResultSet rset1 = stmt1.executeQuery("select * from fstcrd where dafin is not null");
                        while (rset1.rowInserted())
                        {
                          System.out.println("test");
                         // barre.setValue(barre.getValue() + 1);
                        }
                      }                  catch (SQLException ex) {
                      }
                  }
              };
              minuteur.schedule(tache, 0, 100);
    
                  }
                }
    
             catch (SQLException ex) {
             }
    
             
    }//fin run
    }
      }//fin classe

  4. #4
    Membre éclairé Avatar de puybaret
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 61
    Par défaut
    Hum... la modification de ta barre de progression doit s'effectuer dans le Dispatch Thread. Le plus simple dans ton test est d'utiliser la classe javax.swing.Timer au lieu java.util.Timer, car le timer de Swing exécute les appels aux méthodes actionPerformed des timers dans le Dispatch Thread.

  5. #5
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    Tu fais rset1.rowInserted() alors que ta requête est un select ??

    Es tu certain de ne pas devoir utiliser rset1.next() plustot ?

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 193
    Par défaut
    J'ai essayé le rset.next() mais le problème est que les données de ma base proviennent d'un programme qui tourne en arrière plan et que je veux suivre son fonctionnement acec la jprogressbar et donc avec le rset.next() la jprogressbar se remplit avant la fin du programme (le programme n'a pas encore terminé l'insertion dans la base!!)

    Si quelqu'un a une idée:elle sera la bienvenue.

    Merci!!!

  7. #7
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    Si je comprends bien tu as un programme en "batch" qui fait les insert en db (dont tu connais le nombre, pour l exemple disons 50 insert).

    Avec ton applis tu veux indiquer via une progress bar ou tu en es dans les insert ( 20/50 puis 30/50 jusqu'à 50/50)

    Peux tu me dire si j'ai bien compris le problème stp avant de proposer une solution ?

  8. #8
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 193
    Par défaut
    C'est exactement ce que je veux faire et je te remercie d'avance pour ton aide!!

  9. #9
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    Ok, voici la solution que je te propose:

    - Avant du démarrer les insert tu fais un select count().... sur la table dans laquel tu dois insérer les infos. Tu obtiendra disons 20 record.

    - Comme tu sais que tu dois faire 50 insert, à la fin de l'opération tu devras avoir 70 records.
    Les 70 records correspondent à progressBar.setMaximum(70);

    - Tu lances ton batch qui effectue les insert.
    - Tu lances ton thread pour faire progresser la progressBar.
    Tu as donc un thread qui execute la requete select count()... (voir étape n°1) Cette requete te permet de savoir le nombre d'insert effecté. Tu auras donc 20, 26,40 jusqu'à 70.

    La valeur récupérée par ta requête est envoyée à ta progressBar.setValue(20,26,40 jusqu'à 70)

    !!! * Evidemment, ta requête select count()... se trouve dans une boucle (while(progressBar.getValue()<70)....
    !!! * Mets un thread.sleep(1 seconde ou plus) pour ne pas faire trop de requêtes (car tu boucles !!!)

    J'espère que cela te parait clair

  10. #10
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 193
    Par défaut
    Salut!!

    J'ai appliqué ce que tu m'a dit mais ça ne marche pas:il faut dire que je n'y connais rien à propos des threads.

    Voici ce que j'ai fait:

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    package oracle_cnn;
     
    import javax.swing.*;
    import java.awt.*;
    import java.sql.DriverManager;
    import java.sql.*;
    import java.util.Timer;
    import java.util.TimerTask;
     
    public class test extends JFrame{JProgressBar b;
     
    public test(){
    super("ma barre");
    this.setBounds(200,200,200,50);
    b=new JProgressBar(0,50);
    this.getContentPane().add(b);
    this.setVisible(true);
    Thread t=new ThreadAvanceBarre(b);
    t.start();
    }
     
     
    public static void main(String args[]){
     
        try {
                 DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
     
                 // Connexion à la base de données
                Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@127.0.0.1:1521:ferr", "user", "password");
     
                 //Envoyer la requête et récupérer le résulatat
     
                 Statement stmt2 = conn.createStatement();
     
     
                 ResultSet rset2 = stmt2.executeQuery("select count(*) from fstcrd where dafin is not null");
     
                        String ancienne=rset2.getString(0);
     
                        System.out.println("L'ancienne valeur est"+ancienne); //ce que la table contient avant le traitement
    }
     
                      catch (SQLException ex) {
           }
     
    new test();
    }
    //La classe qui correspond au thread pour faire avancer la barre	
    class ThreadAvanceBarre extends Thread {
    JProgressBar barre;
     
     
    public ThreadAvanceBarre(JProgressBar b){
    barre=b;
     
     
    }    
     
     
    public void run(){
     
                        try {
                          sleep(1);
                        }
                        catch (InterruptedException ex1) {
                        }
     
     
     
                      /*** Traitement de test sur la Jprogressbar ***/
     
                      try {
     
                        barre.setMinimum(0);
                        while(barre.getValue()<12)
     
                        {
     
                          DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
     
                 // Connexion à la base de données
                 Connection conn1 = DriverManager.getConnection( "jdbc:oracle:thin:@127.0.0.1:1521:ferr", "user", "password");
     
                          final Statement stmt1 = conn1.createStatement();
                      ResultSet rset1 = stmt1.executeQuery("select count(*) from fstcrd where dafin is not null");
     
                      String nouvelle=rset1.getString(1);
     
                        System.out.println("La nouvelle valeur est"+nouvelle); //ce que la table contient pendant le traitement
     
                        int aInt = Integer.parseInt(nouvelle);
     
                        //.setValue(20,26,40 jusqu'à 70)
                         barre.setValue(aInt);}
     
                       // while (rset1.next())
                       // {
                       //   System.out.println("test");
                       //   barre.setValue(barre.getValue() + 1);
                       // }
                      }                  catch (SQLException ex) {
                      }
     
                }
    }//fin run
    }
      //fin classe
    Si tu pouvais me dire ce qui cloche ça serais très gentil de ta part!!

    (PS:est ce que je dois utiliser un timer ou le thred suffit)

    Merci!!

  11. #11
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 193
    Par défaut
    Aucune idée ?!

    Est ce que je peux faire avancer la progressbar avec un timer et non un thread!

    Merci pour votre aide c'est vraiment urgent!!

  12. #12
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    Lu,

    Voila, c'est fait.

    Je t'explique comment j'ai fais.
    * Creation de 3 classes.
    - 1 pour la JFrame
    - 1 pour le thread
    - 1 pour "lancer" l'applic
    * J'ai mis ton code en commentaire et je l'ai un peu déplacé aussi. Tu retires les commentaires et tu t'arranges pour qu'il marche (j'ai pas de db c'est pour ca les commentaire)

    * L'appli fonctionne sans db (la progress bar évolue), en voyant le code les modifications ne devront pas être dur à appliquer. Le gros de la logique est mise en route.

    Bonne continuation

    La classe test:
    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
     
     
    import javax.swing.JFrame;
     
    /**
     * *.
     * 
     * @author tag
     */
    public class Test extends JFrame {
     
        /***/
        private static int firstTotal = 0;
        /***/
        public static final int NOMBRE_TOTAL_INSERT = 5;
     
        /***/
        public static void test() {
            MaJBar maJBar = new MaJBar(firstTotal);
     
            ThreadAvanceBarre th = new ThreadAvanceBarre(maJBar.getB(), firstTotal);
            th.start();
        }
     
        /***/
        public static void main(String inArgs[]) {
     
            // try {
            // DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
            // Connection conn =
            // DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ferr",
            // "user", "password");
            // Statement stmt2 = conn.createStatement();
            // ResultSet rset2 = stmt2.executeQuery("select count(*) AS firstTotal
            // from fstcrd where dafin is not null");
            // firstTotal = rset2.getInt("firstTotal");
            // System.out.println("L'ancienne valeur est" + firstTotal);
            // conn.close();
     
            firstTotal = 10; // TODO DELETE ME
            // }
            // catch (SQLException ex) {
            // ex.printStackTrace();
            // }
     
            test();
        }
    }
    // fin classe
    Le thread
    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
     
     
    import javax.swing.JProgressBar;
     
     
    /**
     
     * @author aa
     
     */
    public class ThreadAvanceBarre extends Thread {
        /***/
        private JProgressBar barre;
        /***/
        private int nbrEnregistrement = 0;
        /***/
        public ThreadAvanceBarre(JProgressBar inB, int inNbrEnregistrement) {
            this.barre = inB;
            this.nbrEnregistrement = inNbrEnregistrement;
        }
     
        /***/
        public void run() {
            /** * Traitement de test sur la Jprogressbar ** */
     
    //        try {
    //            DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
    //            // Connexion à la base de données
    //            Connection conn1 = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ferr", "user", "password");
    //            final Statement stmt1 = conn1.createStatement();
            this.barre.setMinimum(0);
            int i = 0;
            while (this.barre.getValue() <    (this.nbrEnregistrement + Test.NOMBRE_TOTAL_INSERT)) {
     
    //            ResultSet rset1 = stmt1.executeQuery("select count(*) AS total from fstcrd where dafin is not null");
    //            int totalProgressBar = rset1.getInt("total");
    //            System.out.println("La nouvelle valeur est" + nouvelle);
    //            barre.setValue(totalProgressBar);
                // .setValue(20,26,40 jusqu'à 70)
                i = i + 1;
                this.barre.setValue(i);
     
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException inE) {
                    inE.printStackTrace();
                }
     
            }
     
    // } catch (SQLException ex) {
    // }
     
        }
    }

    La JFrame
    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
     
    import javax.swing.JFrame;
    import javax.swing.JProgressBar;
     
    /** @author a. */
    public class MaJBar extends JFrame {
     
        /***/
        private JProgressBar b;
     
     
        /***/
        private int nbrEnregistrement = 0;
     
        /***/
        public MaJBar(int inNbrEnregistrement) {
            super();
            this.nbrEnregistrement = inNbrEnregistrement;
            build();
        }
        /***/
        private void build() {
            this.setTitle("Ma première application"); 
     
            this.setSize(320, 240);
            this.setLocationRelativeTo(null);
            this.setResizable(false);                                
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     
     
            b = new JProgressBar(0, Test.NOMBRE_TOTAL_INSERT + nbrEnregistrement);
     
            this.getContentPane().add(b);
     
            this.setVisible(true);
        }
     
     
        /**
         * @return the b
         */
        public JProgressBar getB() {
            return this.b;
        }
    }

  13. #13
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    193
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 193
    Par défaut
    Je te remercie!! j'ai adapté ta démarche à mon code (parceque j'ai en plus de cela des onglets, jtables,...) et ça a bien marché.

    Mais j'ai encore un petit problème:je voudrais lancer autant de progressbar qu'il y a de processus en arrière plan:j'ai réussi à afficher les progressbar mais c'est seulement la première qui avance, les autres sont figées: je voulais savoir comment faire pour lancer le même thread en même temps et en parallèle?!

    Je te remercie pour ton aide si précieuse!!

  14. #14
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    A chaud je dirais que tu dois créer autant de thread que de progress bar en lui envoyant la bonne progressBar en paramètre.

Discussions similaires

  1. Exception inattendue : getString() sur Resultset
    Par rastaferraille dans le forum Développement Web en Java
    Réponses: 8
    Dernier message: 20/09/2010, 17h00
  2. SQL sur ResultSet ?
    Par rimas2009 dans le forum JDBC
    Réponses: 9
    Dernier message: 16/06/2010, 22h59
  3. OutOfMemoryError: Java heap space sur ResultSet
    Par SuperFoieGras dans le forum Langage
    Réponses: 14
    Dernier message: 03/09/2008, 17h38
  4. renseignement sur ResultSet et Statement
    Par baptwo dans le forum JDBC
    Réponses: 2
    Dernier message: 28/08/2006, 14h30
  5. Erreur sur ResultSet : forward-only ???
    Par Yaz dans le forum JDBC
    Réponses: 4
    Dernier message: 06/07/2005, 15h33

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