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

 Java Discussion :

Insertion image dans tableau à deux dimensions


Sujet :

Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Par défaut Insertion image dans tableau à deux dimensions
    bonjour,
    je n'arrive pas à résoudre un problème que j'ai et je demande votre aide afin que vous me mettiez sur la bonne voie. J'explique mon problème:
    j'ai dessiné un tableau à deux dimension (4 lignes et 7 colonnes) dans une fenêtre à laide de de la méthode drawLine, dans chaque cases je dois mettre une image différente , cependant je ne sais pas comment faire.

  2. #2
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    pour mettre une image utilise la méthode drawImage.
    Indique la x et y (points en haut à gauche de l'image) ainsi que les dimensions.
    Exemple :
    Normalement tu doit avoir 28 Images (7*4).
    Si toutes tes cases font la même dimension (15 pixel * 15 pixel).
    Pour mettre une image dans la case (6,3) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g.drawImage(MonImage, 6 * 15 , 3 * 15, 15, 15,monObserver);
    javadoc
    A partir de la il est facile d'imaginer une boucle pour ajouter toutes tes images.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Par défaut
    j'ai essayer de faire comme vous m'avais dit, cependant j'ai constaté, que les images ne sont pas dans leur bonne case, et que le tableau que j'ai fait n'est pas pris en considération
    de plus la taille de l'image ne correspond pas à la taille d'une case.
    est ce un problème de coordonnée d'une position?

    voici ma classe Panneau:

    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
    import javax.swing.*;
    import java.awt.*;
    import java.io.*;
     
     
    public class Panneau extends JPanel 
    {
            private Image image;
        private Image im1= (new ImageIcon(Panneau.class.getResource("images/iconeAide.png")).getImage());
        private Image im2= (new ImageIcon(Panneau.class.getResource("images/warning.png")).getImage());
        private Graphics2D g2d;
     
     
        public Panneau() 
        {
            super();
            setPreferredSize(new Dimension(500, 500));
            setLayout(new GridLayout(4,7));
     
     
        }
     
        public Dimension getPreferredSize() 
        {
            Dimension size = super.getPreferredSize();
            if (image != null) 
            {
                size.width = image.getWidth(this);
                size.height = image.getHeight(this);
            }
            return size;
        }
     
        /**
         * Efface le panneau de dessin
         * 
         */        
        public void clearPaint() 
        {
            g2d.setColor(Color.white);
            g2d.fillRect(0, 0, getWidth(), getHeight());
            repaint();
            g2d.setColor(Color.black);
        }
     
        /**
         * @param g Objet graphique permettant de dessiner
         * Definit une zone dans laquelle on va pouvoir dessiner
         */    
        public void paintComponent(final Graphics g) 
        {
            super.paintComponent(g);
            // initialises the image with the first paint
            // or checks the image size with the current panelsize
            if (image == null || image.getWidth(this) < getSize().width || image.getHeight(this) < getSize().height) 
            {
                resetImage();
            }
            Rectangle r = g.getClipBounds();
            g.drawImage(image, r.x, r.y, r.width + r.x, r.height + r.y, r.x, r.y, r.width + r.x, r.height + r.y, null);
        }
        /**
         *
         * Creer une zone, dans laquelle on va pouvoir mettre les images
         */   
        private void resetImage() 
        {
            image = createImage(getWidth(), getHeight());  
            g2d = (Graphics2D) image.getGraphics();
            g2d.setColor(Color.WHITE);
            g2d.fillRect(0, 0, getWidth(), getHeight());
            g2d.setColor(Color.BLACK);
     
            // Creation du cadre noir
            g2d.drawRect(0, 0, getWidth(), getHeight());
            // Les 7 barres noires verticales
            g2d.drawLine((int)((getWidth()*1)/7)+0,0, (int)((getWidth()*1)/7)+0,getHeight()+0);
            g2d.drawLine((int)((getWidth()*2)/7)+0,0,(int)((getWidth()*2)/7)+0, getHeight()+0);
            g2d.drawLine((int)((getWidth()*3)/7)+0,0,(int)((getWidth()*3)/7)+0, getHeight()+0);
            g2d.drawLine((int)((getWidth()*4)/7)+0,0, (int)((getWidth()*4)/7)+0,getHeight()+0);
            g2d.drawLine((int)((getWidth()*5)/7)+0,0,(int)((getWidth()*5)/7)+0, getHeight()+0);
            g2d.drawLine((int)((getWidth()*6)/7)+0,0,(int)((getWidth()*6)/7)+0, getHeight()+0);
            g2d.drawLine((int)((getWidth()*7)/7)+0,0,(int)((getWidth()*7)/7)+0, getHeight()+0);
     
            // Les 4 barres noires horizontales
            g2d.drawLine(0,(int)((getWidth()*1)/4)+0, getHeight()+0,(int)((getWidth()*1)/4)+0);
            g2d.drawLine(0,(int)((getWidth()*2)/4)+0, getHeight()+0, (int)((getWidth()*2)/4)+0);
            g2d.drawLine(0,(int)((getWidth()*3)/4)+0, getHeight()+0,(int)((getWidth()*3)/4)+0);
            g2d.drawLine(0,(int)((getWidth()*4)/4)+0, getHeight()+0, (int)((getWidth()*4)/4)+0);
     
            // teste image case (6,3)
            g2d.drawImage(im1, 6 * 15 , 3 * 15, 15, 15,this);
        }
     
     
        /**
         * @return L'objet graphique permettant le dessin
         * Getteur de l'objet graphique servant à dessiner dans le panneau
         */ 
        public Graphics2D getG2d() 
        {
            return g2d;
        }
    }

  4. #4
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Avec le code je comprend mieux ton besoin.

    En faite, tu peux faire ça de 2 manières. Dans ton cas tu as mélangé les 2 solutions possibles. ( je suis un peu responsable ).

    1 : Tu as un GridLayout(4,7). Il suffit d'ajouter des JLabels à ton gridLayout. JLabel qui contiendra une image ( cf constructeur JLabel)

    2 : Tu n'utilises pas de GridLayout et alors tu fais tous à la main ( dans le paintComponent(Graphics g). c'est la manière que j'ai cité plus haut.

    Pour allé plus loin: Si tu veux gérer les cliques sur tes images :
    pour 1/ tu remplaces les JLabel par des JButton.
    pour 2/ Tu fait un mouseListener sur le panel, tu recupère les coordonées, et via un calcul mathématiques des plus compliqué ( une division ) tu retombe sur l'image.

    Bref : dans ton cas j'utiliserais la méthode 1/ qui est bien plus simple et moins casse-gueule que la 2/

    remarque : si tu veux des bordures noires entre les images, utilise un GridBagLayout, modifie l'Inset (bordures) et met le fond en noire

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Par défaut
    je ne sais pas si mon raisonnement est correcte? : il suffit donc que je récupère la composante X d'une position p dans une méthode par exemple private int getXforPosition(int p) et la composante Y d'une position p dans une méthode par exemple private int getYforPosition(int p) et après les utiliser dans drawImage exemple:
    g2d.drawImage(im1,getXforPosition(...),getYforPosition(...),tailleImage,tailleImage,this);
    pour la bonne taille de l'image faudrait-il que je fasse un calcule afin de la mettre dans la méthode drawImage?

    j'ai fait ces deux méthodes, mais je ne suis pas sur que c'est les bons calcules:

    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
    /**
         * Recupere la composante X d'une position p
         * p Position d'une case
         *  int Coordonne X 
         */
        private int getXforPosition(int p)
        {
            int y=0;
            switch(p)
        {
                case 1:y = 0 + (int)((getHeight()*1)/7);break;
                case 2:y = 0 + (int)((getHeight()*2)/7);break;
                case 3:y = 0 + (int)((getHeight()*3)/7);break;
                case 4:y = 0 + (int)((getHeight()*4)/7);break;
                case 5:y = 0 + (int)((getHeight()*5)/7);break;
                case 6:y = 0 + (int)((getHeight()*6)/7);break;
                case 7:y = 0 + (int)((getHeight()*7)/7);break;
     
                case 8:y = 0 + (int)((getHeight()*1)/7);break;
                case 9:y = 0 + (int)((getHeight()*2)/7);break;
                case 10:y = 0 + (int)((getHeight()*3)/7);break;
                case 11:y = 0 + (int)((getHeight()*4)/7);break;
                case 12:y = 0 + (int)((getHeight()*5)/7);break;
                case 13:y = 0 + (int)((getHeight()*6)/7);break;
                case 14:y = 0 + (int)((getHeight()*7)/7);break;
     
                case 15:y = 0 + (int)((getHeight()*1)/7);break;
                case 16:y = 0 + (int)((getHeight()*2)/7);break;
                case 17:y = 0 + (int)((getHeight()*3)/7);break;
                case 18:y = 0 + (int)((getHeight()*4)/7);break;
                case 19:y = 0 + (int)((getHeight()*5)/7);break;
                case 20:y = 0 + (int)((getHeight()*6)/7);break;
                case 21:y = 0 + (int)((getHeight()*7)/7);break;
     
                case 22:y = 0 + (int)((getHeight()*1)/7);break;
                case 23:y = 0 + (int)((getHeight()*2)/7);break;
                case 24:y = 0 + (int)((getHeight()*3)/7);break;
                case 25:y = 0 + (int)((getHeight()*4)/7);break;
                case 26:y = 0 + (int)((getHeight()*5)/7);break;
                case 27:y = 0 + (int)((getHeight()*6)/7);break;
                case 28:y = 0 + (int)((getHeight()*7)/7);break;
            }
            return y;
     
        }
     
        /**
         * Recupere la composante Y d'une position p
         *  p Position d'une case
         * int Coordonne Y 
         */
        private int getYforPosition(int p)
        {
            int x=0;
            switch(p)
        {
     
                case 1:x = 0 + (int)((getWidth()*1)/4);break;
                case 2:x = 0 + (int)((getWidth()*2)/4);break;
                case 3:x = 0 + (int)((getWidth()*3)/4);break;
                case 4:x = 0 + (int)((getWidth()*4)/4);break;
     
                case 5:x = 0 + (int)((getWidth()*1)/4);break;
                case 6:x = 0 + (int)((getWidth()*2)/4);break;
                case 7:x = 0 + (int)((getWidth()*3)/4);break;
                case 8:x = 0 + (int)((getWidth()*4)/4);break;
     
                case 9:x = 0 + (int)((getWidth()*1)/4);break;
                case 10:x = 0 + (int)((getWidth()*2)/4);break;
                case 11:x = 0 + (int)((getWidth()*3)/4);break;
                case 12:x = 0 + (int)((getWidth()*4)/4);break;
     
                case 13:x = 0 + (int)((getWidth()*1)/4);break;
                case 14:x = 0 + (int)((getWidth()*2)/4);break;
                case 15:x = 0 + (int)((getWidth()*3)/4);break;
                case 16:x = 0 + (int)((getWidth()*4)/4);break;
     
                case 17:x = 0 + (int)((getWidth()*1)/4);break;
                case 18:x = 0 + (int)((getWidth()*2)/4);break;
                case 19:x = 0 + (int)((getWidth()*3)/4);break;
                case 20:x = 0 + (int)((getWidth()*4)/4);break;
     
                case 21:x = 0 + (int)((getWidth()*1)/4);break;
                case 22:x = 0 + (int)((getWidth()*2)/4);break;
                case 23:x = 0 + (int)((getWidth()*3)/4);break;
                case 24:x = 0 + (int)((getWidth()*4)/4);break;
     
                case 25:x = 0 + (int)((getWidth()*1)/4);break;
                case 26:x = 0 + (int)((getWidth()*2)/4);break;
                case 27:x = 0 + (int)((getWidth()*3)/4);break;
                case 28:x = 0 + (int)((getWidth()*4)/4);break;
     
     
            }
            return x;
        }

  6. #6
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    WHAAOUUUU
    Alors oui, tu es sur la bonne voie mais tu t'égare

    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
    import javax.swing.*;
    import java.awt.*;
     
     
    public class Panneau extends JPanel
    {
     
        private Color[][] tableauDeCouleur;
     
     
        public Panneau()
        {
            super();
            setPreferredSize(new Dimension(500, 500));
            tableauDeCouleur = new Color[4][7];
     
            //initialisation du tableau de couleur
            for(int i = 0;i<4;i++){
                for(int j = 0;j<7;j++){
     
     
    //On choisi au hazard rouge, blanc, vert, jaune ou bleu
     
                    int hazard = (int)(Math.random()*5);
                    Color c = Color.RED;
                    switch(hazard) {
                        case 0: c = Color.RED; break;
                        case 1: c = Color.WHITE; break;
                        case 2: c = Color.GREEN; break;
                        case 3: c = Color.YELLOW; break;
                        case 4: c = Color.BLUE; break;
                    }
                    tableauDeCouleur[i][j] = c;
     
                }
            }//Fin initialisation tableau de couleur
     
     
        }
     
     
     
    public void paintComponent(final Graphics g)
        {
     
            dessinerFond(g);
            dessinerBordure(g);
            dessinerInterieurDesCases(g);
     
        }
     
        private void dessinerFond(Graphics g) {
           g.setColor(Color.WHITE);
           g.fillRect(0, 0, getWidth(), getHeight());
        }
     
        private void dessinerBordure(Graphics g)
        {
     
            g.setColor(Color.BLACK);
            // Les 7 barres noires verticales
            for(int i=1;i<7;i++)
                g.drawLine((int)((getWidth()*i)/7),0, (int)((getWidth()*i)/7),getHeight());
     
            // Les 4 barres noires horizontales
            for(int i=1;i<4;i++)
                g.drawLine(0,(int)((getHeight()*i)/4), getWidth(),(int)((getHeight()*i)/4));
     
        }
     
        private void dessinerInterieurDesCases(Graphics g) {
           int largeur =(int) ((getWidth())/7);
           int hauteur =(int) ((getHeight())/4);
     
     
           for(int i = 0;i<4;i++){
                for(int j = 0;j<7;j++){        
                    g.setColor(tableauDeCouleur[i][j]);
                    g.fillRect((j*largeur)+1, (i*hauteur)+1, largeur-1, hauteur-1);
                    //On met des +1 et -1 pour ne pas débordé sur les bordures
     
                }
            }
     
     
     
        }
     
        public static void main(String[] args){
            JFrame f = new JFrame();
            f.setContentPane(new Panneau());
            f.setVisible(true);
        }
     
    }
    C'est un petit programme test que j'ai fait pour que tu comprenne un peu mieux.
    C'est pas commenté mais tu devrais comprendre je pense

    Il pour ton programme final, il faut modifier Color[][] par Image[][], refaire l'initialisation de ton tableau.
    Et modifier dessinerInterieurDesCases pour afficher des images et non des rectangles

    ps : la classe est prête à être lancé. Test chez toi

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Par défaut
    j'ai quelques problèmes au niveau de l'initialisation, mon idée étais que a la place de l'entier
    hazard je devais mettre le numéro de case, et après pour chaque case associée l'image correspondante, cependant je ne sais pas comment obtenir le numéro d'une case.
    Au niveau de de la méthode dessinerInterieurDesCases, j'ai procéder comme 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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     public Panneau()
        {
            super();
            setPreferredSize(new Dimension(500, 500));
            tableauDeImage = new Image[4][7];
     
            //initialisation du tableau d image
            for(int i = 0;i<4;i++)
            {
                for(int j = 0;j<7;j++)
                {
                 Image im=(newImageIcon(Panneau.class.getResource("images/image1.png")).getImage());
            int numberCase=......;
               //On met les images dans les bonnes cases
                    switch(numberCase) 
                    {
                        case 0: im = (new ImageIcon(Panneau.class.getResource("images/image1.png")).getImage()); break;
                        case 1: im = (new ImageIcon(Panneau.class.getResource("images/image2.png")).getImage()); break;
                // case jusqua 28 avec differentes images
                    }
                    tableauDeImage[i][j] = im;
     
                }
            }//Fin initialisation tableau d image
     
     
        }
        private void dessinerInterieurDesCases(Graphics g) {
           int largeur =(int) ((getWidth())/7);
           int hauteur =(int) ((getHeight())/4);
     
     
           for(int i = 0;i<4;i++)
           {
                for(int j = 0;j<7;j++)
                {        
                   g.drawImage(tableauDeImage[i][j], (i *hauteur)+1,(j*largeur)+1,largeur-1, hauteur-1,this);
                    //On met des +1 et -1 pour ne pas débordé sur les bordures
     
                }
            }
     
     
     
        }

  8. #8
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Non, non, non, tu n'y ai pas.
    J'ai mis un nombre aléatoire pour pouvoir choisir des couleurs aléatoirement. Mais c'était pour l'exemple

    Pour ton cas il faut faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    tableauDeImage = new Image[4][7];
    tableauDeImage[0][0] =(new ImageIcon(Panneau.class.getResource("images/image1.png")).getImage());
    tableauDeImage[0][1] =(new ImageIcon(Panneau.class.getResource("images/image2.png")).getImage());
    tableauDeImage[0][2] =(new ImageIcon(Panneau.class.getResource("images/image3.png")).getImage());
    tableauDeImage[0][3] =(new ImageIcon(Panneau.class.getResource("images/image4.png")).getImage());
    //...
    }
    Et tu vas me répondre : " Tu disais que mon premier code était une horreur avec plein plein de lignes. Et la tu veux que je tape un block de 28 lignes. MEURS "
    Mais il y a une solution très simple pour arranger tous ça .
    Il faut faire en sorte que toutes tes images s'appelle comme ça :
    "image" + numéro de la ligne + numéro de la colonne. Exemple : "image25" 2eme lignes et 5eme colonnes
    Et maintenant tu peux faire une petite boucle :

    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
    public Panneau()
        {
            super();
            setPreferredSize(new Dimension(500, 500));
            tableauDeImage = new Image[4][7];
     
     
            for(int i = 0;i<4;i++)
            {
                for(int j = 0;j<7;j++)
                {
                    tableauDeImage[i][j] =(new ImageIcon(Panneau.class.getResource("images/image"+i+j+".png")).getImage());
     
                }
            }
     
     
        }
    Pour dessinerInterieurDesCases ça à l'air d'être ça à première vu.
    Tiens nous au nouvelles.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Par défaut
    il y a un problème au niveau du positionnement de l'image dans la case, l'image n'est pas correctement dans sa case, on peut le constater quand on redimensionne la fenêtre avec la souris.
    le tableau reste le même mais les images ne sont pas dans leurs cases
    j'ai modifier des choses mineures dans la classe, car il fallait un tableau de 4 lignes et 7 colonnes et non pas l'inverse.

    je ne sais pas si mon raisonnement est correcte: je pense qu'il faut prendre en considération la taille de l'image et son positionnement en x et y dans sa case afin quelle reste dans sa case.

    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
    import javax.swing.*;
    import java.awt.*;
     
     
     
    public class Panneau extends JPanel
    {
     
        private Image[][] tableauDeImage;    
     
        public Panneau()
        {
            super();
            setPreferredSize(new Dimension(500, 500));
            tableauDeImage = new Image[7][4]; //tableau de 7 colonne et 4 ligne
     
            for(int i = 0;i<7;i++)
            {
                for(int j = 0;j<4;j++)
                {
                    tableauDeImage[i][j] =(new ImageIcon(Panneau.class.getResource("images/image"+i+j+".png")).getImage());
     
                }
            }
     
        }    
     
     
     
        public void paintComponent(final Graphics g)
        {
     
            dessinerFond(g);
            dessinerBordure(g);
            dessinerInterieurDesCases(g);
     
        }
     
        private void dessinerFond(Graphics g) 
        {
           g.setColor(Color.WHITE);
           g.fillRect(0, 0, getWidth(), getHeight());
        }
     
        private void dessinerBordure(Graphics g)
        {
     
            g.setColor(Color.BLACK);
            // Les 7 barres noires verticales
            for(int i=1;i<7;i++)
                g.drawLine((int)((getWidth()*i)/7),0, (int)((getWidth()*i)/7),getHeight());
     
            // Les 4 barres noires horizontales
            for(int i=1;i<4;i++)
                g.drawLine(0,(int)((getHeight()*i)/4), getWidth(),(int)((getHeight()*i)/4));
     
        }
     
        private void dessinerInterieurDesCases(Graphics g) 
        {
           int largeur =(int) ((getWidth())/7);
           int hauteur =(int) ((getHeight())/4);
     
     
           for(int i = 0;i<7;i++)
           {
                for(int j = 0;j<4;j++)
                {        
            g.drawImage(tableauDeImage[i][j], (i *hauteur)+1,(j*largeur)+1,largeur-1, hauteur-1,this);
                    //On met des +1 et -1 pour ne pas débordé sur les bordures
     
                }
            }
     
     
     
        }
     
        public static void main(String[] args)
        {
            JFrame f = new JFrame();
            f.setContentPane(new Panneau());
            f.setVisible(true);
        }
     
    }

  10. #10
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Si le sujet est close ( si j'ai bien compris) tu peux cliquer sur juste en dessous

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Par défaut
    malheureusement, le sujet n'est pas clos, car je n'arrive pas a positionner les images dans les cases, il y a un décalage entre les images et les cases, j'ai encore besoin de votre aide.
    Merci de votre compréhension.

  12. #12
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    il y a un décalage entre les images et les cases
    Peux tu envoyer une image montrant le problème stp.
    je pense qu'il faut prendre en considération la taille de l'image
    Essaye de redimensionner les images : faq

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Par défaut
    bonjour, je voulais vous envoyer des images concernant mon probleme, mais je ne sais pas comment faire dans le forum, deplus j'ai rajouter une methode public Image RedimensionnerImage(Image image) qui redimensionne une image
    mais je ne sais pas comment l'appliquer a toute les images car le compilateur me met :
    Exception in thread "main" java.lang.IllegalArgumentException: Width (0) and height (0) cannot be <= 0
    at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1016)
    at java.awt.image.BufferedImage.<init>(BufferedImage.java:338)
    at Panneau.RedimensionneImage(Panneau.java:83)
    at Panneau.<init>(Panneau.java:22)
    at Panneau.main(Panneau.java:98)
    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
    import javax.swing.*;
    import java.awt.*;
    import java.awt.image.BufferedImage;
     
     
     
    public class Panneau extends JPanel
    {
     
        private Image[][] tableauDeImage;    
     
        public Panneau()
        {
            super();
            setPreferredSize(new Dimension(300, 300));
            tableauDeImage = new Image[7][4]; //tableau de 7 colonne et 4 ligne
     
            for(int i = 0;i<7;i++)
            {
                for(int j = 0;j<4;j++)
                {
                    tableauDeImage[i][j] =(new ImageIcon(Panneau.class.getResource("images/image"+i+j+".png")).getImage());
     
                }
            }
     
        }    
     
     
     
        public void paintComponent(final Graphics g)
        {
            dessinerFond(g);
            dessinerBordure(g);
            dessinerInterieurDesCases(g);
        }
     
        private void dessinerFond(Graphics g) 
        {
           g.setColor(Color.WHITE);
           g.fillRect(0, 0, getWidth(), getHeight());
        }
     
        private void dessinerBordure(Graphics g)
        {
        Graphics2D graphics2D = (Graphics2D) g;
            BasicStroke stroke = (BasicStroke) graphics2D.getStroke();
        graphics2D.setStroke(new BasicStroke(stroke.getLineWidth() * 6));
     
            graphics2D.setColor(Color.BLACK);
            // Les 7 barres noires verticales
            for(int i=1;i<7;i++)
                graphics2D.drawLine((int)((getWidth()*i)/7),0, (int)((getWidth()*i)/7),getHeight());
     
            // Les 4 barres noires horizontales
            for(int i=1;i<4;i++)
                graphics2D.drawLine(0,(int)((getHeight()*i)/4), getWidth(),(int)((getHeight()*i)/4));
     
        }
     
        private void dessinerInterieurDesCases(Graphics g) 
        {
           int largeur =(int) ((getWidth())/7);
           int hauteur =(int) ((getHeight())/4);
     
           for(int i = 0;i<7;i++)
           {
                for(int j = 0;j<4;j++)
                {         
            g.drawImage(tableauDeImage[i][j], (i *hauteur)+1,(j*largeur)+1,largeur-1, hauteur-1,this);
                    //On met des +1 et -1 pour ne pas débordé sur les bordures
     
     
                }
            }
        }
     
        public Image RedimensionnerImage(Image image) 
        {  
          int largeur =(int) ((getWidth())/7);
          int hauteur =(int) ((getHeight())/4);
          // On cree une nouvelle image aux bonnes dimensions
          BufferedImage buf = new BufferedImage(largeur, hauteur, BufferedImage.TYPE_INT_ARGB);
     
           //On dessine sur le Graphics de l'image bufferisee
          Graphics2D g = buf.createGraphics();
          g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
          g.drawImage(image, 0, 0, largeur, hauteur, null);
          g.dispose();
     
          // On retourne l'image bufferisee, qui est une image
          return buf;
        }
     
        public static void main(String[] args)
        {
            JFrame f = new JFrame();
            f.setContentPane(new Panneau());  
            f.setVisible(true);
        }
     
    }

  14. #14
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Pour le redimensionnement d'image, tu n'as pas besoin de modifier la méthode scale. Il suffit de passer ton image en paramètre avec les nouvelles dimension :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Image tmp = scale(tableauDeImage[i][j],largeur-1,hauteur-1);
     g.drawImage(tmp, (i *hauteur)+1,(j*largeur)+1,largeur-1, hauteur-1,this);
                    //On met des +1 et -1 pour ne pas débordé sur les bordures

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Par défaut
    il y a toujours un décalage entre les images et les cases et je ne comprends pas pourquoi car ça me paraît correcte, l'erreur est devant mes yeux mais je ne la voit pas, les images ne sont pas insérées dans leurs cases respectives tu pourra voir ce décalage en redimensionnant la fenêtre avec la souris,la classe est prête à être lancé.
    Teste la chez toi,il faut juste changer le répertoire des images, et nommé une image quelconque par "image00.png", elle vas être affichée 28 fois mais malheureusement pas dans les cases du 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
    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
    import javax.swing.*;
    import java.awt.*;
    import java.awt.image.BufferedImage;
     
     
     
    public class Panneau extends JPanel
    {
     
        private Image[][] tableauDeImage;    
     
        public Panneau()
        {
            super();
            setPreferredSize(new Dimension(500, 500));
            tableauDeImage = new Image[7][4]; //tableau de 7 colonne et 4 ligne
     
            for(int i = 0;i<7;i++)
            {
                for(int j = 0;j<4;j++)
                {
                    tableauDeImage[i][j] =(new ImageIcon(Panneau.class.getResource("images/image00.png")).getImage());
     
                }
            }
     
        }    
     
     
     
        public void paintComponent(final Graphics g)
        {
            dessinerFond(g);
            dessinerBordure(g);
            dessinerInterieurDesCases(g);
        }
     
        private void dessinerFond(Graphics g) 
        {
           g.setColor(Color.WHITE);
           g.fillRect(0, 0, getWidth(), getHeight());
        }
     
        private void dessinerBordure(Graphics g)
        {
     
            g.setColor(Color.BLACK);
            // Les 7 barres noires verticales
            for(int i=1;i<7;i++)
                g.drawLine((int)((getWidth()*i)/7),0, (int)((getWidth()*i)/7),getHeight());
     
            // Les 4 barres noires horizontales
            for(int i=1;i<4;i++)
                g.drawLine(0,(int)((getHeight()*i)/4), getWidth(),(int)((getHeight()*i)/4));
     
        }
     
        private void dessinerInterieurDesCases(Graphics g) 
        {
           int largeur =(int) ((getWidth())/7);
           int hauteur =(int) ((getHeight())/4);
     
           for(int i = 0;i<7;i++)
           {
                for(int j = 0;j<4;j++)
                {         
            Image tmp = scale(tableauDeImage[i][j],largeur-1,hauteur-1);
     
            g.drawImage(tmp, (i *hauteur)+1,(j*largeur)+1,largeur-1, hauteur-1,this);
                    //On met des +1 et -1 pour ne pas débordé sur les bordures
                }
            }
        }
     
        //Redimensionne une image
        public static Image scale(Image source, int width, int height) 
        {
          /* On crée une nouvelle image aux bonnes dimensions. */
          BufferedImage buf = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
     
          /* On dessine sur le Graphics de l'image bufferisée. */
          Graphics2D g = buf.createGraphics();
          g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
          g.drawImage(source, 0, 0, width, height, null);
          g.dispose();
     
          /* On retourne l'image bufferisée, qui est une image. */
          return buf;
        }
     
        public static void main(String[] args)
        {
            JFrame f = new JFrame();
            f.setContentPane(new Panneau()); 
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.pack(); 
            f.setVisible(true);
        }
     
    }

  16. #16
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Effectivement, petite erreur dans dessinerCaseInterieur :
    Remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g.drawImage(tmp, (i *hauteur)+1,(j*largeur)+1,largeur-1, hauteur-1,this);
    Par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g.drawImage(tmp, (i *largeur)+1,(j*hauteur)+1,largeur-1, hauteur-1,this);
    Normalement maintenant c'est bon

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Par défaut
    mon problème est résolu, je te remercie pour ton aide et pour ta patience que tu m'a accordé.

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

Discussions similaires

  1. [phpToPDF] Insertion image dans tableau PDF
    Par kanabzh29 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 17/09/2008, 08h29
  2. Réponses: 19
    Dernier message: 12/09/2007, 15h34
  3. Insertion image dans tableau
    Par tidoc dans le forum VB.NET
    Réponses: 2
    Dernier message: 30/07/2007, 11h28
  4. Rechercher dans un tableau deux dimensions
    Par angelevil dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 28/09/2006, 20h29
  5. tri alphabétique dans un tableau deux dimensions
    Par *!!cocco!!* dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 06/12/2004, 21h38

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