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 :

Ajouter une image dans un JTable dans un JPanel dans une JFrame


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 12
    Par défaut Ajouter une image dans un JTable dans un JPanel dans une JFrame
    Bonjour,

    J'ai fouillé internet (sûrement pas suffisamment...), mais je ne comprends pas pourquoi je n'ai que l'adresse de mes images qui s'affiche et pas l'image elle-même.
    J'ai suivi ces explications :
    https://www.developpez.net/forums/d1...olonne-jtable/

    Et bien d'autres encore sans succès !
    Quand je copie colle le code (du premier lien en particulier) tout fonctionne à merveille, mais quand je l'adapte à mon code plus rien ne fonctionne...
    J'ai une JFrame dans laquelle j'instancie deux Panels (chacun est indépendant et est dans une nouvelle classe). Celui du bas affiche un JTable dans un JScrollPane. Ce JTable est créé par un modèle qui étend AbstractTableModel.

    Voici des morceaux de code :
    Ma classe tableau Modèle :
    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
     
     
    import javax.swing.table.AbstractTableModel;
     
     
    //Modèle de tableau
    public class ModeleTableauListeAteliers extends AbstractTableModel {
     
      /**
             * 
             */
    	private static final long serialVersionUID = 20190120;
     
     
    	private int nbLignesTableau;
    	private Object[][] data;
           private String[] title;
     
    	//Tableau qui prend en paramètre un tableau
            public ModeleTableauListeAteliers(Object [][] data, String[] titre) {
            this.data = data;
            this.title = titre;
      }
     
     
     
      //Nombre de colonnes du tableau
      public int getColumnCount() {
    	  return title.length;
      }
     
      //Nombre de lignes du tableau
      public int getRowCount() {
     
    	 // return nbLignesTableau;
    	  return this.data.length;
      }
     
      //Les différents contenus des cellules du tableau
      public Object getValueAt(int row, int col) {
     
    	  return this.data[row][col];
      }
     
      //Le nom des colonnes
      public String getColumnName(int col) {
    	  return this.title[col];
      }
     
     
    //Retourne la classe de la donnée de la colonne
      public Class getColumnClass(int col){
        //On retourne le type de la cellule à la colonne demandée
        //On se moque de la ligne puisque les types de données sont les mêmes quelle que soit la ligne
        //On choisit donc la première ligne
        return this.data[0][col].getClass();
      }
     
    }
    Ma classe JPanel :
    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
     
    //JPanel pour les ateliers
    	public class pnlBordureAteliers extends JPanel implements MouseListener {
     
    		private static final long serialVersionUID = 20190125;
     
    		public pnlBordureAteliers() {
     
    private Object[][] listeAteliersConvertie = {   
    		      {"Cysboy", new JButton("6boy"), new Double(1.80), new ImageIcon("Images/Maths/perles.jpg")},
    		      {"BZHHydde", new JButton("BZH"), new Double(1.78), new ImageIcon("Images/Maths/perles.jpg")},
    		      {"IamBow", new JButton("BoW"), new Double(1.90), new ImageIcon("Images/Maths/perles.jpg")},
    		      {"FunMan", new JButton("Year"), new Double(1.85), new ImageIcon("Images/Maths/perles.jpg")}
    		    };
     
    public void afficherTableauListeAteliers(ArrayList<Atelier> listeaAfficher, int selectionLigne) {
     
    			String[] titresColonnes = {"Nom", "Catégorie", "Image", "ok?"};
    			tableauAteliers = new ModeleTableauListeAteliers(listeAteliersConvertie, titresColonnes);
    			//Mettre ce modèle dans un JTable
    			tableauDonneesAteliers = new JTable(tableauAteliers);
    			tableauDonneesAteliers.getColumnModel().getColumn(3).setCellRenderer(new ImageCellRenderer());
     
    			//Mettre le JTable dans un JScrollPane indispensable pour avoir les titres de colonnes
    			tableauAteliersComplet = new JScrollPane(tableauDonneesAteliers);
     
    			//Ajouter le nouveau tableau dans le JPanel
    			grillePanneauAteliers.gridx = 1;
    			grillePanneauAteliers.gridy = 0;
    			//Taille de la case
    			grillePanneauAteliers.gridheight = 2;
    			//Marges (haut, gauche, bas, droite)
    			grillePanneauAteliers.insets = new Insets(0,100,0,0);
    			tableauAteliersComplet.setPreferredSize(new Dimension(500,150));
    			//Ajouter le tableau
    			this.add(tableauAteliersComplet, grillePanneauAteliers);
    		}
     
    		public class ImageCell implements TableCellRenderer {
     
    			@Override
    			public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
    					int row, int column) {
    				// TODO Auto-generated method stub
    				JLabel label = new JLabel();
    				label.setText((String)listeAteliersConvertie[row][1]);
    				label.setIcon((ImageIcon)listeAteliersConvertie[row][3]);
    				return (Component) label;
    			}
    		}
     
    		public class ImageCellRenderer extends DefaultTableCellRenderer {
     
    			@Override
    			public Component getTableCellRendererComponent(JTable table,
    					Object value, boolean isSelected, boolean hasFocus, int row,
    					int column) {
     
    				Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
     
    				JLabel label = (JLabel)component;
    				String cheminImage = String.valueOf(value);
     
    				ImageIcon icon = new ImageIcon(cheminImage);
     
    				if ( icon.getImageLoadStatus()==java.awt.MediaTracker.COMPLETE ) {
    					label.setIcon(icon);
    					table.setRowHeight(row, icon.getIconHeight());
    				}
    				else {
    					label.setIcon(null);
    					table.setRowHeight(row, table.getRowHeight());
    				}
    				label.setText(""); // on efface le texte
    				return component;
    			}
    		}
     
    }
    @Override
    		public void mouseClicked(MouseEvent e) {
    			//Déterminer quelle catégorie est sélectionnée
    			selection = PanneauGestionAteliers.tableauDonneesCategories.getSelectedRow();
    			//Appeler la méthode d'affichage du tableau de la catégorie
    			afficherTableauListeAteliers(listeAteliersUneCategorie, selection);
    		}
    Lorsque je lance mon programme, je n'ai pas les images, mais seulement leur adresse (dernière colonne)

    Nom : ErreurAffichageImage.png
Affichages : 374
Taille : 54,6 Ko

    Je cherche maintenant depuis 3 jours et je commence à baisser les bras !
    Si quelqu'un peut me venir en aide, ce serait génial !!
    Merci d'avance !

  2. #2
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 12
    Par défaut
    Bonjour,

    Je pense avoir une piste...
    L'arrayList qui me sers à aller dans le JTable provient d'une extraction d'une table dans une base de données dans laquelle je suis censé avoir enregistré des images (en BYTEA)...

    Du coup, il se peut que je ne récupère pas correctement mon image de ma BDD... je vais creuser par-là !

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 12
    Par défaut
    Bonjour,

    Cette solution n'était qu'illusoire... la solution n'avait rien à voir !

    En fait mon problème venait d'ailleurs, j'ai défini un DefaultTableRenderer pour centrer le texte de mes cellules APRÈS celui permettant d'afficher les images... Le JTable ne prenait que le dernier en compte donc me mettait l'adresse des images centrées...

    Il m'a suffit de mettre le centrage des cellules en premier, PUIS le CellRenderer pour que les images s'affichent !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //Centrer le contenu du tableau des ateliers D'ABORD
    for (int numColonne = 0 ; numColonne < tableauDonneesAteliers.getColumnCount(); numColonne++)
     {
      TableColumn colonne = tableauDonneesAteliers.getColumnModel().getColumn(numColonne);
    	DefaultTableCellRenderer renduCellules = new DefaultTableCellRenderer(); 
    	//Alignement horizontal : centré
    	renduCellules.setHorizontalAlignment(SwingConstants.CENTER);
    	colonne.setCellRenderer(renduCellules);
    }
     
    //Paramétrer ENSUITE l'affichage de la colonne
    tableauDonneesAteliers.getColumnModel().getColumn(2).setCellRenderer(new ImageCellRenderer());
    En espérant que cela serve à d'autres...

    Bonne journée

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/04/2009, 23h15
  2. Réponses: 4
    Dernier message: 24/10/2008, 19h51
  3. Réponses: 1
    Dernier message: 05/09/2007, 12h47
  4. Réponses: 5
    Dernier message: 08/05/2006, 00h39
  5. [JPanel]Mettre une image dans un JPanel
    Par ehmppowa dans le forum Composants
    Réponses: 11
    Dernier message: 30/11/2005, 20h17

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