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 :

suite dessin polygone à main levée


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 10
    Points
    10
    Par défaut suite dessin polygone à main levée
    Bonjour,

    maintenant que j'ai réussi à dessiner un polygone à main levée, j'aimerais pouvoir en dessiner plusieurs.
    Comment est ce que je peux faire cela? Parce que pour l'instant, je ne peux en faire qu'un seul.

    Ensuite, je voudrais pouvoir en sélectionner un pour le supprimer.

    J'ai vu qu'il y avait une discussion sur la sélection et la suppression sur un panel mais ça ne m'avance pas tellement donc si quelqu'un pouvait m'aider, ce serait cool.

    diambu

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 867
    Points : 22 927
    Points
    22 927
    Billets dans le blog
    53
    Par défaut
    Euh ? Tu sais faire un polygone ? Parfait ! Une fois l'edition terminee (c'est a toi de determiner la maniere dont on termine cette edition soit par exemple lorsqu'on pose le dernier point sur ou a cote/dans un certain rayon du premier de la liste ou lorsqu'on clique avec la molette de la souris), tu parcoure ta liste de points pour creer une nouvelle Shape (soit avec Polygon, soit avec GeneralPath) et tu stockes ce polygone dans une liste de figure. Tu vides alors ta liste de points entrain d'etre edites, tu re-affiches et tu recommence jusqu'a ce que l'edition soit a nouveau terminee et a nouveau tu ajoute ce polygone a la liste des polygones crees. Tu re-affiches.

    Pour la selection : lors d'un clic a la souris tu parcoures la liste des polygones (en general en partant de la fin car ceux affiches sur le dessus sont a la fin de la liste) et tu appelles la methode contains() pour verifier que tu es dedans. Si c'est le cas, ton polygone actif est le polygone actuellement teste et tu sors de la boucle de recherche. Tu re-affiches. A toi de voir pour le peindre de maniere differente (possiblement en affichant sa boite englobante en pointilles pour le faire ressortir ou alors en l'affichant d'une autre couleur) pour le mettre en valeur.

    Pour supprimer, a la reception de l'evenement clavier correspondant a la touche SUPPR, une action ou un evenement souris que tu definieras, tu retires ton polygone selectionne de la liste des polygones et tu nullifie la variable du polygone selectionne. Tu re-affiches.

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    merci bouye pour les explications qui sont plus que précises. Je vais les appliquer de suite.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    bonsoir,

    je sais que j'arrive un peu tard, mais je viens de débuter en programmation il n'y a pas longtemps et j'ai un souci similaire.
    je dessine un polygone dans une jframe avec la procédure mouse moved mais le souci c'est que je ne sais pas comment arrêter de faire suivre mon trait avec la souris une fois le polygone fermé (qui se fait à l'aide du clic molette). ensuite est-ce que vous pourriez donner plus d'explications concernant l'outil Shape.
    Moi j'avais essayé en voulant faire une ArrayList d'ArrayList de Point mais j'ai dû zapper énormément de chose car rien n'était bon sauf la déclaration. est-ce que quelqu'un pourrait-il m'aider?? s'il vous plaît.

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 867
    Points : 22 927
    Points
    22 927
    Billets dans le blog
    53
    Par défaut
    C'est simple, il te faut gerer un etat "edition"/"pas edition" :

    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
    private List<Shape> shapeList = new LinkedList<Shape>();
    private List<Point> pointList = new LinkedList<Point>();
    private boolean isEditing = false;
    private int mouseX;
    private int mouseY;
     
    /**
    * {@inheritDoc}
    */
    @Overridepublic void mouseMoved(MouseEvent event) {
      if (isEditing) {
        mouseX = event.getX();
        mouseY = event.getY();
      }
      repaint();
    }
     
    /**
    * {@inheritDoc}
    */
    @Overridepublic void mouseClicked(MouseEvent event) {
      if (SwingUtilities.isLeftClickButton()) {
         // 1er click on demarre l'edition.
         if (!isEditing) {
           isEditing = true;
         }
         pointList.add(new Point(event.getX(), event.getY());
       }
       else if (SwingUtilities.isMiddleClickButton()) { 
         isEditing = false;
         if (pointList.size() >= 2) {
           Path2D.Float path = new Path2D.Float();
           path.moveTo(pointList.get(0));
           for (int i - 1 ; i < pointList.size() ; i++) {
              path.lineTo(pointList.get(i));
           }
           path.closePath();
           shapeList.add(path);
         }
         pointList.clear();
       }
       repaint();
    }
     
    /**
    * {@inheritDoc}
    */
    @Override
    protected void paintComponent(Graphics g) {
      [...]
      for (Shape shape : shapeList) {
         g2d.draw(shape);
      }
      if (isEditing) {
        g2d.setColor(Color.RED);
        for (int i = 0 ; i < pointList.size() - 1 ; i++) {
          Point p1 = pointList.get(i);
          Point p2 = pointList.get(i+1);
          g2d.drawLine(p1.x, p1.y, p2.x, p2.y);
        }
        g2d.setColor(Color.GREEN);
        Point p1 = pointList.get(pointList.size()-1);
        g2d.drawLine(p1.x, p1.y, mouseX, mouseY);    
      }
    }

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Merci pour la rapidité de votre réponse bouye. En vous écrivant d'autre question se pose à moi : quelle est la différence entre une List, une LinkedList et une ArrayList?
    quelle est le rôle de la variable Path2D.Float?
    je n'arrive pas à imaginer à quoi correpond l'objet Shape? est-ce un polygone particulier?
    je n'arrête pas de découvrir les choses, et pourtant j'ai l'impression à chaque fois qu'il me reste encore plus à découvrir que la dernière fois. c'est bizarre? non?
    j'espère que vous pourrez encore venir à mon aide bouye.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    j'ai un autre souci bouye, je viens de tester votre code, et le problème est que il faut attendre le deuxième clic avant que le trait suit la souris. De plus chaque déplacement est dessiné, moi je voulais que l'on dessine pour de bon une fois que l'on a cliqué, j'ai essayé de modifier votre code mais je n'ai pas réussi. Moi j'utilise pour créer un seul polygone une ArrayList de point, mais je ne trouve pas comment rafraîchir le JPanel dans votre code. Pourriez-vous m'aider? je remets le code car j'ai affiché le tout dans une JFrame.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    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
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Point;
    import java.awt.Shape;
    import java.awt.event.InputEvent;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    import java.awt.geom.Path2D;
    import java.util.LinkedList;
    import java.util.List;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    class Essai_1 extends JPanel implements MouseListener, MouseMotionListener {
     
        private List<Shape> shapeList = new LinkedList<Shape>();
        private List<Point> pointList = new LinkedList<Point>();
        private boolean isEditing = false;
        private int mouseX;
        private int mouseY;
        private JFrame frame;
     
    public Essai_1(JFrame f){
       this.frame=f;
    }
     
        /**
         * {@inheritDoc}
         */
        public void mouseMoved(MouseEvent event) {
            if (isEditing) {
                mouseX = event.getX();
                mouseY = event.getY();
            }
            repaint();
        }
     
        /**
         * {@inheritDoc}
         */
        public void mouseClicked(MouseEvent e) {
            if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0) {
                // 1er click on demarre l'edition.
                if (!isEditing) {
                    isEditing = true;
                }
                pointList.add(new Point(e.getX(), e.getY()));
            } else if ((e.getModifiers() & InputEvent.BUTTON2_MASK) != 0) {
                isEditing = false;
                if (pointList.size() >= 2) {
                    Path2D.Float path = new Path2D.Float();
                    path.moveTo(pointList.get(0).x, pointList.get(0).y);
                    for (int i = 1; i < pointList.size(); i++) {
                        path.lineTo(pointList.get(i).x, pointList.get(i).y);
                    }
                    path.closePath();
                    shapeList.add(path);
                }
                pointList.clear();
            }
            repaint();
        }
     
        /**
         * {@inheritDoc}
         */
        protected void paintComponent(Graphics g) {
            Graphics2D g2d = (Graphics2D) g;
            for (Shape shape : shapeList) {
                g2d.draw(shape);
            }
            if (isEditing) {
                g2d.setColor(Color.RED);
                for (int i = 0; i < pointList.size() - 1; i++) {
                    Point p1 = pointList.get(i);
                    Point p2 = pointList.get(i + 1);
                    g2d.drawLine(p1.x, p1.y, p2.x, p2.y);
                }
                g2d.setColor(Color.GREEN);
                Point p1 = pointList.get(pointList.size() - 1);
                g2d.drawLine(p1.x, p1.y, mouseX, mouseY);
            }
        }
     
        public void mousePressed(MouseEvent e) {
            //throw new UnsupportedOperationException("Not supported yet.");
        }
     
        public void mouseReleased(MouseEvent e) {
            //throw new UnsupportedOperationException("Not supported yet.");
        }
     
        public void mouseEntered(MouseEvent e) {
            //throw new UnsupportedOperationException("Not supported yet.");
        }
     
        public void mouseExited(MouseEvent e) {
            //throw new UnsupportedOperationException("Not supported yet.");
        }
     
        public void mouseDragged(MouseEvent e) {
            //throw new UnsupportedOperationException("Not supported yet.");
        }
        public static void main(String[] args){
            JFrame fr=new JFrame();
            Essai_1 e=new Essai_1(fr);
            fr.setSize(800,800);
            fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            fr.add(e);
            fr.setVisible(true);
        }
    }

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 867
    Points : 22 927
    Points
    22 927
    Billets dans le blog
    53
    Par défaut
    C'est pourtant pas dur :

    Citation Envoyé par bouye Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [...]
        repaint();
    [...]
    Je ne sais pas chez moi un polygone ca a au moins 2 points (3 chez d'autres), de plus le code dessine le polygone en train d'etre edite en rouge et la ligne en train d'etre tiree en vert. Apres c'est du code tape sur le vif, non teste, qui peut avoir besoin d'etre corrige pour tourner.

  9. #9
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 867
    Points : 22 927
    Points
    22 927
    Billets dans le blog
    53
    Par défaut
    1) tu as oublie de mettre les listeners sur le panel, donc forcement ca ne dessine pas grand chose.

    2) faut appeller super.paintComponent() sinon ca affiche un peu n'importe quoi vu que tu n'as pas declare le panel comme etant non-opaque (il est transparent puisque tu n'appelle pas la super methode).

    3) quelques corrections de ci de la.

    4) il faut manipuler les composant AWT/Swing dans l'EDT, pas dans la thread du main !

    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
     
    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package test;
     
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Insets;
    import java.awt.Point;
    import java.awt.RenderingHints;
    import java.awt.Shape;
    import java.awt.event.InputEvent;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    import java.awt.geom.Path2D;
    import java.util.LinkedList;
    import java.util.List;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
     
    class Essai_1 extends JPanel implements MouseListener, MouseMotionListener {
     
        private List<Shape> shapeList = new LinkedList<Shape>();
        private List<Point> pointList = new LinkedList<Point>();
        private boolean isEditing = false;
        private int mouseX;
        private int mouseY;
        private JFrame frame;
     
        public Essai_1(JFrame f) {
            this.frame = f;
            addMouseListener(this);
            addMouseMotionListener(this);
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        public void mouseMoved(MouseEvent event) {
            if (isEditing) {
                mouseX = event.getX();
                mouseY = event.getY();
            }
            repaint();
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        public void mouseClicked(MouseEvent e) {
            if ((e.getModifiers() & InputEvent.BUTTON1_MASK) != 0) {
                // 1er click on demarre l'edition.
                if (!isEditing) {
                    isEditing = true;
                }
                pointList.add(new Point(e.getX(), e.getY()));
                mouseX = e.getX();
                mouseY = e.getY();
            } else if ((e.getModifiers() & InputEvent.BUTTON2_MASK) != 0) {
                Point p = new Point(e.getX(), e.getY());
                // Avoids very small polygons.
                if (!p.equals(pointList.get(pointList.size() - 1))) {
                    pointList.add(p);
                }
                isEditing = false;
                if (pointList.size() >= 2) {
                    Path2D.Float path = new Path2D.Float();
                    path.moveTo(pointList.get(0).x, pointList.get(0).y);
                    for (int i = 1; i < pointList.size(); i++) {
                        path.lineTo(pointList.get(i).x, pointList.get(i).y);
                    }
                    path.closePath();
                    shapeList.add(path);
                }
                pointList.clear();
            }
            repaint();
        }
     
        /**
         * {@inheritDoc}
         */
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Dimension size = getSize();
            Insets insets = getInsets();
            Graphics2D g2d = (Graphics2D) g.create(insets.left, insets.top, size.width - (insets.left + insets.right), size.height - (insets.top + insets.bottom));
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            try {
                for (Shape shape : shapeList) {
                    g2d.draw(shape);
                }
                if (isEditing) {
                    g2d.setColor(Color.RED);
                    for (int i = 0; i < pointList.size() - 1; i++) {
                        Point p1 = pointList.get(i);
                        Point p2 = pointList.get(i + 1);
                        g2d.drawLine(p1.x, p1.y, p2.x, p2.y);
                    }
                    g2d.setColor(Color.GREEN);
                    Point p1 = pointList.get(pointList.size() - 1);
                    g2d.drawLine(p1.x, p1.y, mouseX, mouseY);
                }
            } finally {
                g2d.dispose();
            }
        }
     
        @Override
        public void mousePressed(MouseEvent e) {
            //throw new UnsupportedOperationException("Not supported yet.");
        }
     
        @Override
        public void mouseReleased(MouseEvent e) {
            //throw new UnsupportedOperationException("Not supported yet.");
        }
     
        @Override
        public void mouseEntered(MouseEvent e) {
            //throw new UnsupportedOperationException("Not supported yet.");
        }
     
        @Override
        public void mouseExited(MouseEvent e) {
            //throw new UnsupportedOperationException("Not supported yet.");
        }
     
        @Override
        public void mouseDragged(MouseEvent e) {
            //throw new UnsupportedOperationException("Not supported yet.");
        }
     
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
     
                @Override
                public void run() {
                    JFrame fr = new JFrame();
                    Essai_1 e = new Essai_1(fr);
                    fr.setSize(800, 800);
                    fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    fr.add(e);
                    fr.setVisible(true);
                }
            }
     
        }
    }
    Apres pour le reste c'est a toi d'adapter a tes besoin.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    merci de vos conseils utiles! quelle est la conséquence pour la suite?
    oui dans le code envoyé j'avais oublié d'ajouter le MouseMotionListener et le MouseListener au JPanel, donc on ne visualisait rien sur la fenêtre.
    mais pourquoi ne faut-il pas mettre la déclaration des JFrames dans le thread du main?

  11. #11
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 867
    Points : 22 927
    Points
    22 927
    Billets dans le blog
    53
    Par défaut
    Les composants AWT & Swing s'attendent a etre manipules dans l'EDT pour avoir un comportement correct. L'EDT est la Thread chargee des affichages et des propaggations d'evenements pour l'AWT et Swing (ainsi les differents ecouteurs sont executes sequentiellement dans l'EDT entre deux cycles d'affichage).
    Bien que la plupart du temps on ne voit pas apparaitre de problemes au fait de lancer une JFrame directement depuis la Thread du main(), cela ne veut pas dire que cela ne peut pas arriver. D'autant plus que Java est disponible sur plein de platformes differentes et fournis par des vendeurs differents (Sun, Apple, IBM, etc...) et que certains comportements lies au multithreading peuvent varier d'une JVM a l'autre.

    Dans les fait, j'ai deja rencontre des problemes en faisant cela sous Linux avec les JVM de Sun et d'IBM lors du passage de la 1.3 a la 1.4 par exemple.
    Il est bon de prendre de bonne habitudes des le depart.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    D'accord, merci pour cette précision bouye. Je vais essayer de faire marcher le programme sous linux, pour voir si je rencontre une différence.
    j'aurais voulu savoir si avec la méthode contains() on peut traiter avec les coordonnées des points d'un polygone, pour pouvoir les modifier avec l'événement MouseReleased ? Ou comment faire pour de nouveau traiter avec les coordonnées de la variable Shape ?

  13. #13
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 867
    Points : 22 927
    Points
    22 927
    Billets dans le blog
    53
    Par défaut
    La méthode contains() permet de vérifier si le point testé est DANS la forme. Pour les sommets mieux faut utiliser le PahtIterator de la forme et se créer une zone/marge d'erreur autour du sommet genre un cercle ou un carré.

    L'algo pourrait se résumer à :

    -si clic : parcours de la liste des formes pour trouver le polygon active via contains() (partir de la fin de la liste car les polygones à la fin de la liste sont ceux affichés par dessus les autres).

    - si un polygone est trouvé : on génère une List<Point> à partir de son PathIterator. Au besoin modifier la méthode de rendu pour afficher cette liste de points avec des petits carrés qui vont bien sur les noeuds (comme dans la plus part des éditeurs. Si besoin tagger la forme pour qu'elle ne soit plus rendue mais qu'on rende uniquement sa forme éditable.

    - si click près d'un noeud : ce noeud devient le mode actif, on passe en mode déplacement de noeud. Si besoin se créer une enum qui définiera les différents états de l'éditeur genre NORMAL, SHAPE_EDIT, NODE_EDIT, etc. et changer l'état de l'éditeur au besoin.

    - on tire la souris : on modifie les coords du noeud dans la liste. A l'écran ca se traduit par la forme éditable du polygone qui se modifie.

    - on termine l'édition du noeud : on convertit notre liste de points en Path et on remplace l'ancien Path par le nouveau dans la liste.

    Pour le PathIterator, il faut lui passer en argument un float[6] qu'on crée au début histoire d'éviter d'allouer un tableau à chaque point. Comme les polygones sont avec des cotés droits seul les deux premières valeurs sont pertinentes (ce sont les coordonnées x et y destinations du lineTo())

  14. #14
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 867
    Points : 22 927
    Points
    22 927
    Billets dans le blog
    53
    Par défaut
    J'oubliais :
    Citation Envoyé par steffanopou Voir le message
    D'accord, merci pour cette précision bouye. Je vais essayer de faire marcher le programme sous linux, pour voir si je rencontre une différence.
    Cela n'est pas le problème, les interractions entre diverses Threads sont difficiles à prédire et il est tout à fait possible que le programme fonctionne sans aucune erreur ou qu'au contraire il plante dès le départ. La règle (édictée par Sun) reste : IL NE FAUT PAS UTILISER LES COMPOSANTS AWT/SWING HORS DE L'EDT. C'est une règle qu'il faut se forcer à suivre dès le départ .

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Voilà j'ai terminé la création de mon premier module de dessin.

    Il permet la création de polygone, la modification de polygone en tirant sur les points et la suppression de polygone en ayant préalablement cliqué dessus.

    Cependant ce que je n'arrive pas à faire c'est la détection de la couleur d'un pixel.

    En fait ce que je fais : je crée une BufferedImage de ma fenetre puis avec la méthode getRGB(x,y) je dois pouvoir prendre l'entier qui corespond à la couleur sur le dessin. Cependant quand je test avec la couleur par défaut light_gray comme fond d'un jpanel l'entier renvoyé par getRGB vaut -1 et lorsque je crée la variable Color c =new Color.light_gray l'entier renvoyé par c.getRGB vaut quelque chose comme -4142364. Je ne comprends pas pourquoi.

    Mon but final est de pouvoir changer la couleur d'un pixel en fonction du déplacement de la souris (Mousemoved) s'il est contenu dans une shape et que la couleur de son pixel est une certaine couleur (par exemple le light_gray).

    Je ne sais pas si c'est la bonne méthode à adopter, j'ai bien regarder le forum

    http://www.developpez.net/forums/d30.../creer-images/

    qui traite des différentes types d'images. Mais je n'arrive pas au résultat et je ne vois pas pourquoi.

    Pourriez-vous me donner une indication sur la marche à suivre pour capter la couleur d'un pixel dans un jpanel?

    Merci d'avance,

  16. #16
    Membre éclairé Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Points : 773
    Points
    773
    Par défaut
    pour extraire les couleurs à partir de l'entier retourné par la méthode getRGB : http://java.developpez.com/faq/gui/?..._encodage_RGBA

Discussions similaires

  1. Dessin à main levée
    Par miss_sig dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 23/05/2014, 19h48
  2. Logiciel UML "dessins à main levée"
    Par Ricoco dans le forum Diagrammes de Classes
    Réponses: 3
    Dernier message: 01/08/2012, 13h58
  3. Dessin à main levée avec Delphi
    Par Duan dans le forum Débuter
    Réponses: 3
    Dernier message: 17/07/2011, 18h06
  4. Réponses: 1
    Dernier message: 10/01/2011, 15h50
  5. dessin polygone à main levée sur panel
    Par diambu dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 02/07/2007, 12h52

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