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 :

dessiner sur un tableau d'image


Sujet :

Java

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Points : 62
    Points
    62
    Par défaut dessiner sur un tableau d'image
    je voudrais savoir comment dessiner sur une image,j'ai un tableau d'image dans une fenêtre, dans mon cas j'ai les lettres de l'alphabet français, et je voudrais savoir comment faire pour récupérer toutes les lettre d'un mot en utilisant la souris en dessinant un trait sur les lettres du mot, et récupérer ainsi le mot choisi?
    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
        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());
     
                }
            }
     
        }

  2. #2
    Membre expérimenté 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 : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    Applique un mouseListener sur ton JPanel.

    Des exemples ici
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Points : 62
    Points
    62
    Par défaut
    je voudrais savoir si il y a un moyen pour récupérer les coordonnées des lettre sur lesquelles j'ai tracé un trait?

  4. #4
    Membre expérimenté 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 : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    je voudrais savoir si il y a un moyen pour récupérer les coordonnées des lettre sur lesquelles j'ai tracé un trait?
    Oui, mais tu vas devoir le coder toi même

    Regarde les MouseListener.
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Points : 62
    Points
    62
    Par défaut
    je voudrais savoir si avec mon raisonnement j'arrive à obtenir le numéro d'une case du tableau : j'explique , pour obtenir la position en X , je fait position_souris_en_X/ taille_case_en_X et pour obtenir la position en Y , je fait position_souris_en_Y/ taille_case_en_Y et de ce fait obtenir le résultat qui correspond à la case du tableau en mémoire.

  6. #6
    Membre expérimenté 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 : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    C'est exactement ça
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Points : 62
    Points
    62
    Par défaut
    je voudrais savoir comment ça se passe au niveau de la mémoire dans les tableaux en java , comment faire correspondre une chaine de caractère a une position dans un tableau d'image, genre tableauDeImage[0][0]="image de A" avec le caractère "A"
    image de A est de type Image et A est de type String.

    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
        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());
     
                }
            }
     
        }

  8. #8
    Membre expérimenté 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 : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    Il y a plusieurs façon de faire en faite. Même plein.

    1/ Mettre le caractères directement dans le nom de l'images "imageA25.png"
    Et pour le récupérer char c = nomDeLImage.charAt(5);

    OU

    2/ Créer un Char[][] dans lequel du stocke tes caractères. En s'arrangant pour que les images de tableauDeImage correspondent au caractères de Char[][]

    Il y en a d'autres, mais ces deux là sont simple à mettre en place
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Points : 62
    Points
    62
    Par défaut
    je voudrais savoir si ma méthode est correcte pour obtenir la position d'une case dans le tableau car je ne suis pas sur du résultat :
    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
     /**
         * Récupère une position p a partir des coordonnées de la souris
         * x Coordonne x position de la souris
         * y Coordonne y position de la souris
         * retourne int Position d'une case dans le tableau 
         */ 
     
    private int getPositionAvecCoordonneesSouris(int x,int y)
        {
            int caseX,caseY;
     
            int largeur =(int) ((getWidth())/7);
            int hauteur =(int) ((getHeight())/4);
     
            caseX = x / largeur;
            caseY = y / hauteur;
     
            if ( (caseX>=0) && (caseX<7) && (caseY>=0) && (caseY<4) )
                return (7*caseX)+(caseY*4);
            else return -1;
        }

  10. #10
    Membre expérimenté 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 : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    Continue le code dans la condition " if ( (caseX>=0) && (caseX<7) && (caseY>=0) && (caseY<4) )".
    Et retourne au final un caractère & non un int.
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Points : 62
    Points
    62
    Par défaut
    ne crois tu pas qu'il faut décomposer la fonction en deux? une fonction qui récupère la position et une autre qui fait correspondre la position à un caractère? dis moi si il y a plus simple au niveau de mon raisonnement:

    mon raisonnement étais de déclarer un ArrayList<Integer> tab_position et un ArrayList<String> alphabet

    dans alphabet j'aurais mis alphabet.add(0,"A"); //A, alphabet.add(1,"B"); //B
    ainsi de suite...

    dans dans la méthode mouseDragged( MouseEvent event ) j'aurrais récupérer
    toute les positions des cases dans tab_position

    dans la méthode mouseReleased(MouseEvent e) j'aurais fais la correspondance entre les positions et le caractères en parcourant le tab_position(i),et les concaténés a un string "resultat" initialiser à "" et apres j'aurais le mot choisi dans resultat

  12. #12
    Membre expérimenté 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 : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    Ton raisonnement est bon et logique.
    Mais il peut y avoir quelque soucis d'ergonomie :
    1/ mouseDragged s'active dès que la souris bouge. Donc dans tabPosition tu auras peut-être 20 fois la même lettre à suivre. (le temps que l'utilisateur bouge la souris d'une case à l'autre)

    2/ tu peux régler le problème de 1/ en faisant une condition ( si la lettre = précédente = lettre conrante : ne rien faire) Mais à ce moment tu ne pourras plus avoir 2 lettres identiques qui se suivent (exemple : pomme -> pome)

    Bref, j'utiliserais plus un mouseClicked plutôt qu'un dragged
    Après ça dépend encore une fois de ce que tu veux faire au final?

    Edit : ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (7*caseX)+(caseY*4);
    est plus que douteux.
    Il ne retournera JAMAIS 1,2,3,5,6,9,...
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Points : 62
    Points
    62
    Par défaut
    je voudrais savoir si ma méthode est correcte pour obtenir la position d'une case dans le tableau car je ne suis pas sur du résultat la première fois elle étais fausse, si tu voit que c'est encore faux, pourrais tu me dire dans quelle direction je dois chercher? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private int getPositionAvecCoordonneesSouris(int x,int y)
    {
            int caseX,caseY;
     
            int largeur =(int) ((getWidth())/7);
            int hauteur =(int) ((getHeight())/4);
     
            caseX = x *7/ largeur;
            caseY = y *4/ hauteur;
     
            if ( (caseX>=0) && (caseX<7) && (caseY>=0) && (caseY<4) )
                return caseX + caseY * 7;
            else return -1;
    }

  14. #14
    Membre expérimenté 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 : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    ça à l'air bon
    Plus cas récupérer ton caractère qui est dans l'arraylist.
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Points : 62
    Points
    62
    Par défaut
    j'ai un problème pour récupérer les positions d'une case dans la méthode
    mouseDragged( MouseEvent event ), les traits déssiner ne correspondent pas a des traits normau( on dirait comme si un stylo à encre coulait...), je pense que ma méthode mouseDragged( MouseEvent event ) est la cause de mon problème, qu'en penses tu ?


    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
     
    /**
         * @param event Evenement de la souris
         * Lorsque la souris est en mouvement : 
         *  -> on dessine sur le panneau de dessin 
         *  -> on stocke les positions dans ArrayList<Integer> tab_position
         */
        public void mouseDragged( MouseEvent event )
        {
            if( ! mode_dessin )
            {
                old_point = event.getPoint();
                mode_dessin = true;
            }
            else
            {
                int position=0;
                position= this.getPositionAvecCoordonneesSouris(event.getX(),event.getY());
                getGd().setColor( Color.RED );  // getGd getter sur Graphics g
                getGd.drawLine( (int) old_point.getX(), (int) old_point.getY(), event.getX(), event.getY() );
                tab_position.add( position );
            }
            repaint(); // on rafraichit le panneau
        }

  16. #16
    Membre expérimenté 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 : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    Pourquoi dessine tu dans MouseDragged?
    Peux-tu envoyer une capture d'écran du problème, on donner un peux plus de code pour pouvoir tester.

    Mais c'est suspect comme code! on dirais que tu dessine dans la méthode mouseDragged. Normalement tous doit être fait dans la méthode paintComponent.
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Points : 62
    Points
    62
    Par défaut
    comme je dois dessiner avec la souris je croyais que je devais utiliser la méthode "public void mouseDragged(MouseEvent event) ", j'ai fais un getter sur Graphics g, pour pourvoir dessiner sur les lettres , mais j'ai des erreurs, donc je l'ait mis en commentaires, et le drawLine() aussi, tu ma conseiller de dessiner grâce à la méthode "public void paintComponent(Graphics g)", mais je ne voit pas comment faire puisqu'il faut utiliser les événements de la souris.De plus j'ai essayer d'afficher les positions des différentes cases quand la souris passe dessus, cependant l'obtient que des -1. Voici le 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
    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
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
     
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.BufferedImage;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionListener;
    import java.util.ArrayList;
    import java.awt.Graphics;
     
    public class Panneau extends JPanel implements MouseMotionListener,MouseListener
    {
     
        private Image[][] tableauDeImage;
        private boolean mode_dessin;
        private int position;
        private ArrayList<Integer> tab_position;
        private ArrayList<String> alphabet;
        private Point old_point;
        private Graphics g;
        private String res="";
     
     
        public Panneau()
        {
            super();
            setPreferredSize(new Dimension(500, 500));
        tab_position = new ArrayList<Integer>();
        old_point = new Point();
            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());
     
                }
            }
            mode_dessin=false;
            this.addMouseListener(this);
            this.addMouseMotionListener(this);mode_dessin=false;
        }
     
        private void chargerDico()
        {
            alphabet = new ArrayList<String>(26);
     
            alphabet.add(0,"A"); //A
            alphabet.add(1,"B"); //B
            alphabet.add(2,"C"); //C
            alphabet.add(3,"D"); //D
            alphabet.add(4,"E"); //E
            alphabet.add(5,"F"); //F
            alphabet.add(6,"G"); //G
            alphabet.add(7,"H"); //H
            alphabet.add(8,"I"); //I
            alphabet.add(9,"J"); //J
            alphabet.add(10,"K"); //K
            alphabet.add(11,"L"); //L
            alphabet.add(12,"M"); //M
            alphabet.add(13,"N"); //N
            alphabet.add(14,"O"); //O
            alphabet.add(15,"P"); //P
            alphabet.add(16,"Q"); //Q
            alphabet.add(17,"R"); //R
            alphabet.add(18,"S"); //S
            alphabet.add(19,"T"); //T
            alphabet.add(20,"U"); //U
            alphabet.add(21,"V"); //V
            alphabet.add(22,"W"); //W
            alphabet.add(23,"X"); //X
            alphabet.add(24,"Y"); //Y
            alphabet.add(25,"Z"); //Z
        }
     
        public void mouseMoved(MouseEvent event) 
        {
     
        }
     
        public void mouseDragged(MouseEvent event) 
        {
        if( ! mode_dessin )
        {
            old_point = event.getPoint();
            mode_dessin = true;
        }
        else
        {
            int position=0;
            // position de la souris en x et y
            int x = (int)(event.getPoint().getX() + this.getLocationOnScreen().getX());
            int y = (int)(event.getPoint().getY() + this.getLocationOnScreen().getY());
     
            position= this.getPositionAvecCoordonneesSouris(x,y);
     
     
            //this.getGd().setColor( Color.RED ); ->>> pose probleme
            old_point = event.getPoint();
            // pose probleme this.drawLine()
            //this.drawLine( (int) old_point.getX(), (int) old_point.getY(), event.getX(), event.getY() );
            //System.out.println("coordonnees x:"+x+" y:"+y);
            if( tab_position.size() <= 0 || tab_position.get( tab_position.size() - 1 ) != position )
            {
                tab_position.add( position );
            }
            this.repaint(); // on rafraichit le panneau
        }
        }
        public void mouseReleased(MouseEvent event)
        {
           mode_dessin = false;
           tab_position.size();
           String tmp="";
           System.out.println("Positions : "+tab_position); // Affiche le tableau de positions
           for(int i=0; i < tab_position.size(); i++)
           {
               tmp=Integer.toString(tab_position.get(i));
               res+=tmp;
           }
     
           System.out.println("resultat : "+res); // Affiche resultat    
           tmp=""; res=""; tab_position.clear();  
        }
     
        public void mouseClicked(MouseEvent event) 
        {
        }
     
        public void mouseEntered(MouseEvent event) 
        {    
        }
     
        public void mouseExited(MouseEvent event) 
        {    
        }
     
        public void mousePressed(MouseEvent event) 
        {
        }
     
        public Graphics getGd() 
        {
            return g;
        }
        public int getPositionAvecCoordonneesSouris(int x,int y)
        {
          int caseX,caseY;
     
          int largeur =(int) ((getWidth())/7);
          int hauteur =(int) ((getHeight())/4);
     
          caseX = x *7/ largeur;
          caseY = y *4/ hauteur;
     
          if ( (caseX>=0) && (caseX<7) && (caseY>=0) && (caseY<4) )
            return caseX + caseY * 7;
          else return -1;
        }
     
        public void paintComponent(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 *largeur)+1,(j*hauteur)+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);
        }
     
    }

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Les méthode des listeners doivent enregistrer des éléments qui serviront à faire le dessin dans le paintComponent, puis déclenchent un repaint, point barre.

    Les objets Graphics d'un composant ne DOIVENT être utilisés qu'à l'intérieur de la méthode paintComponent (en effet les Graphics sont des objets à durée de vie éphémère, et sont remis à blanc à chaque repaint)....
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  19. #19
    Membre expérimenté 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 : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    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
    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
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.BufferedImage;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseMotionListener;
    import java.awt.Graphics;
     
    public class Panneau extends JPanel implements MouseMotionListener,MouseListener
    {
     
        private Image[][] tableauDeImage;
        private char[][] alphabet;
        private boolean mode_dessin;
        private Point old_point,new_point;
        private StringBuffer res;
        private char courantChar=0;
     
     
        public Panneau()
        {
            super();
            setPreferredSize(new Dimension(500, 500));
            res = new StringBuffer();
            old_point = new Point();
            new_point = new Point();
            tableauDeImage = new Image[7][4]; //tableau de 7 colonne et 4 ligne
            alphabet = new char[7][4];
            char c = 'A';
     
            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());
                    alphabet[i][j]=c;
                    c++;//incrémente c. Si c= 'A'; c++; c sera égal à 'B'
     
                }
            }
     
            mode_dessin=false;
            this.addMouseListener(this);
            this.addMouseMotionListener(this);
     
        }
     
     
        public void mouseMoved(MouseEvent event)
        {
            new_point = event.getPoint();
            if(mode_dessin){
                this.repaint(); // on rafraichit le panneau
     
                //On ajoute la lettre au résultat final
                int caseX,caseY;
                int largeur =(int) ((getWidth())/7);
                int hauteur =(int) ((getHeight())/4);
     
                caseX = new_point.x / largeur;
                caseY = new_point.y / hauteur;
     
                if ( (caseX>=0) && (caseX<7) && (caseY>=0) && (caseY<4)){//Si la souris est dans la fenêtre
                    //Si le caractere courant == 0 : premier click
                    //Si res.length() == 0 : premier click
                    //res.charAt(res.length()-1)!=alphabet[caseX][caseY] : si le dernier caractère est le même que le courant
                    //-> toujours sur la même case
                    if(courantChar == 0 || res.length() == 0 || res.charAt(res.length()-1)!=alphabet[caseX][caseY]){
                        courantChar = alphabet[caseX][caseY];
                        res.append(courantChar);
                    }
                }
            }
     
        }
     
        public void mouseDragged(MouseEvent event){
            mouseMoved(event);
        }
        public void mouseReleased(MouseEvent event){
           mode_dessin = false;
           this.repaint();
            System.out.println(res.toString());//Affichage du résultat
            res = new StringBuffer();//Réinitialise le résultat
        }
     
        public void mouseClicked(MouseEvent event){}
        public void mouseEntered(MouseEvent event){}
        public void mouseExited(MouseEvent event){}
        public void mousePressed(MouseEvent event){
            mode_dessin = true;
            old_point = event.getPoint();
        }
     
     
     
        public void paintComponent(Graphics g)
        {
            if(!mode_dessin){
                dessinerFond(g);
            }else if(mode_dessin){
                g.drawLine( (int) old_point.getX(), (int) old_point.getY(), (int) new_point.getX(), (int) new_point.getY() );
                old_point = new_point;
            }
        }
     
        //Dessine le fond
        private void dessinerFond(Graphics g){
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, getWidth(), getHeight());
     
            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));
     
     
            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 *largeur)+1,(j*hauteur)+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);
        }
     
    }
    Au lieu d'utiliser un ArrayList j'ai utilisé un char[7][4]. C'est bien plus pratique je trouve.
    Aussi, pas la peine de faire 26 lignes pour initialiser l'arrayList (c'est très moche au passage ) une boucle suffit.
    Bref, la solution ci-dessus marche, et j'ai commenté les endroits que j'ai modifiés.
    Plus qu'à faire une toute petite condition pour les 2 dernières cases (27 et 28) qui ne font pas partie de l'alphabet.

    Bonne continuation
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Points : 62
    Points
    62
    Par défaut
    j'ai essayé de faire une condition au niveau des 2 dernières cases (27 et 28), cependant je n'arrive pas a enlever du résultat final, les caractères en trop. Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    if ( (caseX>=0) && (caseX<7) && (caseY>=0) && (caseY<4))
    {
                    if(courantChar == 0 || res.length() == 0 ||  res.charAt(res.length()-1)!=alphabet[caseX][caseY])
                    {
                         if( (caseX!=6 && caseY!=2) || (caseX!=6 && caseY!=3) )
                         {
                                courantChar = alphabet[caseX][caseY];
                                res.append(courantChar);
                         }
                    }
    }

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Gros souci de 1px environ sur un tableau avec image
    Par gus02 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 18
    Dernier message: 26/05/2008, 10h10
  2. Dessiner sur une image
    Par cquadjul dans le forum C++Builder
    Réponses: 2
    Dernier message: 19/04/2006, 10h44
  3. Dessiner sur une image
    Par alex6891 dans le forum Java ME
    Réponses: 1
    Dernier message: 16/04/2006, 02h45
  4. Déplacer, zoomer, dessiner (sur) une image
    Par charlito dans le forum 2D
    Réponses: 4
    Dernier message: 22/02/2006, 01h58
  5. [Servlet] [Image] Dessiner sur une image
    Par gaia_dev dans le forum 2D
    Réponses: 5
    Dernier message: 01/09/2004, 17h11

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