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 :

JTable et les images contenus dans une base de donnees


Sujet :

Composants Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Février 2014
    Messages : 21
    Points : 18
    Points
    18
    Par défaut JTable et les images contenus dans une base de donnees
    Bonjour a tous,je suis confronté à un soucis.En effet, je voudrais afficher les images de ma base de données MYSQL dans un JTable. J'arrive juste à afficher soit la premiere image de ma base de données ou la derniere image de ma base de données; avec ce code:
    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 java.awt.Component;
    import javax.imageio.ImageIO;
    import javax.swing.ImageIcon;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableCellRenderer;
     
    /**
     *
     * @author 15
     */
    public class ImageRenderer extends DefaultTableCellRenderer {
        private Product produit;
        private Object[][] donnees;
        private ImageIcon img=null;
     
         @Override
        @SuppressWarnings("UnnecessaryContinue")
         public Component getTableCellRendererComponent(JTable table, Object value,
                              boolean isSelected, boolean hasFocus, int row, int column) {
            try {
                super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                produit=new Product();
                produit.connection();
     
                produit.stmt=produit.conn.createStatement();
                produit.rs=produit.stmt.executeQuery("SELECT image FROM product");
                if(column==3){
                    while(produit.rs.next()){
                        img=new ImageIcon();
                        img.setImage(ImageIO.read(produit.rs.getBinaryStream("image")));
                        this.setIcon(img);
                        this.repaint();
                        return this;    
                    }   
                }
     
            } catch (Exception ex) {
     
            }
            return this;
         }
     
     
    }
    Grave que j'ai tout essayé!!!
    Voci le resultat si j'utilise ce Renderer pour l'affichage des cellules.
    Nom : Capture.PNG
Affichages : 531
Taille : 17,0 Ko

    Merci de votre aide svp

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    Déjà il faudrait afficher une erreur dans la catch() et ne pas le laisser vide.

    Ensuite tu fais une boucle while avec dedans un return (forcement la boucle ne sert plus a rien).

    Tu devrais faire une requête avec un identifiant pour n'obtenir qu'un retour et pas demander tout d'un coup pour de toute façon ne pas exploiter les resultats.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Février 2014
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Toujours rien !!! J'ai des erreurs de type SQL, j 'ai mis l'identifiant grace a l'id mais c'est a ce niveau aue les chose se complique, je crois!!

  4. #4
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Le code de ton renderer ne choisit pas l'image correspondant à la ligne que tu veux. C'est pour ca que tu obtiens soit la 1ere (si tu mets un return sur le premier resultat) soit la derniere (si tu lis tous les resultats).
    Il faut utiliser l'objet value ou te debrouiller pour recuperer l'id du product qui t'interesse et ne recuperer que la ligne en question.

    Si tu n'y arrives pas, il faut montrer le code qui remplit le tableau.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Février 2014
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Voici mon code qui remplit le tableau:
    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
     
     public Object[][] afficheDonnees() throws SQLException{
            Object[][] donnees;
            try{
     
               String sql="SELECT * FROM product";
               stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
               rs=stmt.executeQuery(sql);
               int i=0,j=0;
     
               if(rs.next()){
                   rs.last();
                   i=rs.getRow();
                   rs.beforeFirst();
               }
               donnees=new Object[i][4];
               while(rs.next()){
                donnees[j][0]=rs.getString(2);
                donnees[j][1]=rs.getString(3);
                donnees[j][2]=rs.getString(4);
                donnees[j][3]=rs.getBinaryStream(5);
                j++;
            }
            }finally{
              try{
                  rs.close();
                  conn.close();
              }catch(Exception e){}
            }
            return donnees;
      }
    En effet, la je suis dans la classe metier,cette methode me renvois un tableau d'objet que je s'insere directement dans mon modele que j'ai definis. Et voila, le code du modele que j'utilise.
    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
     
     */
    public class ModeleTable extends AbstractTableModel{
        private Object[][] donnees;
        private String[] titres;
     
        public ModeleTable(Object[][] donnees,String[] titres){
            this.donnees=donnees;
            this.titres=titres;
        }
     
        @Override
        //Pour le nombre de lignes
        public int getRowCount() {
            return this.donnees.length;   
        }
     
        @Override
        //Pour le nombre de colonnes
        public int getColumnCount() {
           return this.titres.length;
        }
     
        @Override
        //Pour l'element a l'indice j et i
        public Object getValueAt(int rowIndex, int columnIndex) {
           return this.donnees[rowIndex][columnIndex];
        }
     
        @Override
        public String getColumnName(int columnIndex){
                return titres[columnIndex];
          }
        @Override
        public Class getColumnClass(int columnIndex){
               return this.donnees[0][columnIndex].getClass();
        }
        @Override
        public boolean isCellEditable(int index,int i){
            return false;
        }
     
    }
    Et maintenant voici mon nouveau code de mon ImageRenderer, j'utilise cette fois un tableau de type InputStream, mais c'est toujours la meme chose.
    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
     
     public Component getTableCellRendererComponent(JTable table, Object value,
                              boolean isSelected, boolean hasFocus, int row, int column) {
            try {
                super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
     
                produit=new Product();
                produit.connection();
     
                produit.pst=produit.conn.prepareStatement("SELECT image FROM product");
                produit.rs=produit.pst.executeQuery();
     
                 int nbreLigne=0; int i=0;
     
                  if(produit.rs.next()){
                   produit.rs.last();
                   nbreLigne=produit.rs.getRow();
                   produit.rs.beforeFirst();
               }
               InputStream[] id=new InputStream[nbreLigne];
               while(produit.rs.next()){
                     id[i]=produit.rs.getBinaryStream(1);
                     i++;
               }
     
                if(column==3){
                    int l=0;
                   for(;l<id.length;l++){
                       if(id[l]!=null){
                          img=new ImageIcon();
                          img.setImage(ImageIO.read(id[l]));
                          this.setIcon(img);
                          this.repaint();
     
                       }
     
     
                   } 
                     return this;
          }       
     
            } catch (Exception ex) {}
     
            return this;
         }

  6. #6
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    Une fois ton tableau récupérer et ton modèle le recevant, je ne vois pas pourquoi tu fais des requêtes SQL dans le renderer (ce qui en plus niveau performance est surement catastrophique) puisque les données sont en mémoire ?! A mon avis t'as pas du bien comprendre comment fonctionne les renderer de table je me trompe ?
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Février 2014
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Oui, je ne comprends pas tres bien son fonctionnement, mais je modifie tout d'abord mon code dans le renderere en recuperant dans mon tableau mes images et je vais voir ce que sa donne...Et merci pour le conseil sur la performance,c'est un element tres important qu'on oublie tres souvent..Merci!!!

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Février 2014
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    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
    public class ImageRenderer extends DefaultTableCellRenderer {
        private Product produit;
        private Object[][] donnees;
        private ImageIcon img=null;
     
         @Override
        @SuppressWarnings("UnnecessaryContinue")
         public Component getTableCellRendererComponent(JTable table, Object value,
                              boolean isSelected, boolean hasFocus, int row, int column) {
     
            try {
     
                super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
     
                produit=new Product();
                produit.connection();
                donnees=produit.afficheDonnees();
                int l=0;
                while(l<donnees.length){
                        img=new ImageIcon();
                        img.setImage(ImageIO.read((InputStream)donnees[l][3])); 
                        this.setIcon(img);
                    l++; 
                }
     
            } catch (Exception ex) {
                Logger.getLogger(ImageRenderer.class.getName()).log(Level.SEVERE, null, ex);
            }
            return this;
         }
    Voila j'ai modifie mon code du renderer mais le resultat est toujours le meme, vraiment je comprends pas!!1

  9. #9
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 978
    Points
    7 978
    Par défaut
    Il faut que tu lises un tutorial sur les renderer.

    La variable passée en paramètre "Object value" contient normalement déjà les données puisqu'elle viennent du modèle que tu as au préalable remplis avec les donnée venant de ta requêtes.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Gabon

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Février 2014
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Merci!!!j'ai trouve le hic.En effet, une erreur de precision sur mon code metier de la classe Product, il valait juste que je change sa.
    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
     public Object[][] afficheDonnees() throws SQLException{
            Object[][] donnees;
            try{
     
               String sql="SELECT * FROM product";
               stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
               rs=stmt.executeQuery(sql);
               int i=0,j=0;
     
               if(rs.next()){
                   rs.last();
                   i=rs.getRow();
                   rs.beforeFirst();
               }
               donnees=new Object[i][4];
               while(rs.next()){
                donnees[j][0]=rs.getString(2);
                donnees[j][1]=rs.getString(3);
                donnees[j][2]=rs.getString(4);
             >>>   donnees[j][3]=rs.getBinaryStream(5);
                j++;
            }
            }finally{
              try{
                  rs.close();
                  conn.close();
              }catch(Exception e){}
            }
            return donnees;
      }
    En ca!
    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
     public Object[][] afficheDonnees() throws Exception{
            Object[][] donnees;
            try{
     
               String sql="SELECT * FROM product";
               stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
               rs=stmt.executeQuery(sql);
               int i=0,j=0;
     
               if(rs.next()){
                   rs.last();
                   i=rs.getRow();
                   rs.beforeFirst();
               }
               donnees=new Object[i][4];
               while(rs.next()){
                donnees[j][0]=rs.getString(2);
                donnees[j][1]=rs.getString(3);
                donnees[j][2]=rs.getString(4);
       >>> donnees[j][3]=new ImageIcon(ImageIO.read(rs.getBinaryStream(5)));
                j++;
            }
            }finally{
              try{
                  rs.close();
                  conn.close();
              }catch(Exception e){}
            }
            return donnees;
      }
    Merci beaucoup de votre aide, maintenant toutes mes images en base s'affichent comme le montre la figure.
    Nom : Capture.PNG
Affichages : 499
Taille : 17,1 Ko

    J'espere cela aidera d'autres personnes, merci a vous!!!

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

Discussions similaires

  1. [SQL] réduire les images provenant d'une base de données
    Par ph_anrys dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 26/06/2006, 10h48
  2. Réponses: 21
    Dernier message: 05/06/2006, 10h49
  3. [MySQL] Afficher une image stockée dans une base de données
    Par LuckySoft dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/04/2006, 12h57
  4. Réponses: 1
    Dernier message: 14/11/2005, 11h04
  5. Réponses: 1
    Dernier message: 23/10/2005, 00h55

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