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

2D Java Discussion :

[Graphics2D]couleur de ligne2D,lors passage souris


Sujet :

2D Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 31
    Points : 19
    Points
    19
    Par défaut [Graphics2D]couleur de ligne2D,lors passage souris
    bonjour
    je voudrais savoir comment changer la couleur d'une ligne lors du passage de la souris ?
    j'ai googlé et n'ai rien trouvé
    ( cours de dessins en Java, mais c'est tout...)

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Bonjour,

    Une recherche google avec les mots clés "forum java mouse shape graphics2d" amène pourtant aux deux liens suivants qui contiennent déjà un certain nombre d'informations.
    http://www.javalobby.org/java/forums/t18266.html
    http://forum.java.sun.com/thread.jsp...sageID=2057542

    Nicolas

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    ah oui, mais faut connaitre les bon mots clefs
    je vais regarder merci...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    je viens de lire les deux liens mais le pb c'est que dans mon cas je ne peut pas appliquer cette technique ( classe MouseListener et utiliser contains pour savoir si le point de la souris est positionné dessu )
    le pb c'est que mes lignes sont tracés dynamiquement et je ne sais jamais combien il y en a comment faire ?
    ( elles sont tracés en fonction de la taille du graphique, de sa position, des chiffres a representés, de l'espace reservé pour chaque ligne et du chiffre a representer )

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Bonjour,

    Je ne comprends pas très bien ton dernier message.
    Les lignes sont rajoutées dynamiquement, mais tu en gardes bien trace quelque part, ne serait-ce que pour les dessiner, non ?
    Dans ce cas, il suffit que le MouseMotionListener vérifie si la souris est sur l'une d'entre elles ou non.

    Je me suis pris au jeu. Ci-dessous un exemple, fait rapidement et largement améliorable :
    - les lignes sont représentées graphiquement par des polygones ;
    - elles sont rajoutées dynamiquement (à chaque clic de souris), et stockées dans une ArrayList ;
    - à chaque passage de la souris sur une ligne, cette dernière est affichée en rouge, puis revient en couleur normale quand la souris la quitte.

    Nicolas

    Fonctionnement :
    - cliquer sur la souris pour faire apparaître une nouvelle ligne ;
    - promener la souris sur les lignes pour le faire changer de couleur

    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
     
    // par Nicolas_75
    import java.awt.*;
    import java.awt.event.*;
    import java.util.ArrayList;
    import java.util.Random;
    import javax.swing.*;
     
    // classe représentant une ligne (dessinée comme un polygone)
    class MyLine extends Polygon {
     
        // épaisseur de la ligne
        final private static int lineWidth = 2;
     
        // booléean indiquant si la ligne est activée (suite au passage de la souris)
        // dans ce cas, elle se dessinera en rouge
        boolean activated = false;
     
        // constructeur prenant en paramètres les coordonnées des extrémités de la ligne
        public MyLine(int x1, int y1, int x2, int y2) {
            super(); // super = Polygon
            // construction du polygone représentant la ligne
            this.addPoint(x1 + lineWidth, y1 - lineWidth);
            this.addPoint(x1 - lineWidth, y1 + lineWidth);
            this.addPoint(x2 - lineWidth, x2 - lineWidth);
            this.addPoint(x2 + lineWidth, x2 + lineWidth);
        }
     
        public boolean isActivated() { return this.activated; }
     
        public void setActivated() { this.activated = true; }
     
        public void setNotActivated() { this.activated = false; }
    }
     
     
    // classe principal dessinant 4 lignes, qui changent de couleur quand la souris passe dessus
    public class ListenerOnLine extends JComponent implements MouseMotionListener {
     
        // taille de la fenetre
        private final static int dimensionComponent = 400;
     
        // tableau contenant les lignes
        private final ArrayList<MyLine> lines = new ArrayList<MyLine>();
     
        // générateur de nombre aléatoires
        private final Random r = new Random();
     
        // constructeur
        public ListenerOnLine() {
            this.setPreferredSize(new Dimension(dimensionComponent,dimensionComponent));
            // ajout du listener de déplacement de la souris
            this.addMouseMotionListener(this);
            // ajout du listener de clic sur la souris
            this.addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent e) {
                    ListenerOnLine.this.addNewLine();
                }
            }
            );
        }
     
        // rajoute une nouvelle ligne
        public void addNewLine() {
            lines.add(new MyLine(r.nextInt(dimensionComponent), r.nextInt(dimensionComponent), r.nextInt(dimensionComponent), r.nextInt(dimensionComponent)));
            repaint();
        }
     
        public void paint(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;
            // dessin des lignes
            for (int i=0; i<lines.size(); i++) {
                if (lines.get(i).isActivated()) {
                    // si la ligne a été "activée" (suite à un passage de la souris)
                    // alors elle est dessinée en rouge
                    g2.setColor(Color.red);
                } else {
                    g2.setColor(Color.blue);
                }
                g2.fill(lines.get(i));
            }
        }
     
        public void mouseMoved(MouseEvent e) {
            int x = e.getX();
            int y = e.getY();
     
            for (int i=0; i<lines.size(); i++) {
                if ((lines.get(i).contains(x, y)) && (!lines.get(i).isActivated())) {
                    // si la souris est sur une ligne, et que cette ligne n'est pas encore activée
                    // alors il faut l'activer, et redessiner (elle apparaitra en rouge)
                    lines.get(i).setActivated();
                    repaint();
                }
                if ((lines.get(i).isActivated()) && (!lines.get(i).contains(x, y))) {
                    // si une ligne est "activée" (suite à un passage de la souris)
                    // mais que la souris n'est plus dessus
                    // alors il faut la désactiver, et redessiner (elle apparaitra en normal)
                    lines.get(i).setNotActivated();
                    repaint();
                }
            }
        }
     
        public void mouseDragged(MouseEvent e) {}
     
        public static void main(String[] args) {
            JFrame frame = new JFrame("Appuyez sur le bouton de la souris pour faire apparaître une nouvelle ligne");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(new ListenerOnLine());
            frame.pack();
            frame.setVisible(true);
        }
    }

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    bonjour,
    Les lignes sont rajoutées dynamiquement, mais tu en gardes bien trace quelque part, ne serait-ce que pour les dessiner, non ?
    non, en fait je passais le graphics2D a la fonction traceLesLignes() et je fesait directement drawline,
    mais depuis ce post j'ai avancé et j'ai finit mon truc.
    j'ai fait exactement comme toi ( a peu pres ) en me basant sur un cour de ce site ( ne me souviens plus de l'auteur ) + un script trouvé sur le net
    mais merci de m'avoir donné ce code, comme ça je comparererait avec le mien


    ps:
    je n'avais pas mis resolu car je pensais que mon post etait aux oubliettes, dsl.

    Edit :
    private final ArrayList<MyLine> lines = new ArrayList<MyLine>();
    quest-ce que les "balises" dans la declaration de l'arrayList ?

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Ces "balises", apparues avec Java 1.5, servent juste à indiquer qu'il s'agit d'une ArrayList contenant des MyLine.

    Tutoriel : http://java.sun.com/j2se/1.5.0/docs/.../generics.html

    Nicolas

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    ah d'accord, c'est juste pour ne pas avoir a caster en fait.

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Par goût du travail bien fait, ci-dessous un 2ème code.
    Les lignes y sont proprement codées par des Line2D, et non des polygones.
    Dans ce cas, il est plus difficile de vérifier si la souris passe dessus.
    On calcule donc la distance entre la position de la souris et chacun des segments par les formules mathématiques classiques.

    Nicolas

    Fonctionnement :
    - cliquer sur la souris pour faire apparaître une nouvelle ligne ;
    - promener la souris sur les lignes pour les faire changer de couleur

    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
    // appeler le fichier ListenerOnLine2.java
    // par Nicolas_75
     
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.Line2D;
    import java.util.ArrayList;
    import java.util.Random;
    import javax.swing.*;
     
    // classe représentant une ligne
    class MyLine2 extends Line2D.Float {
     
        // coordonnes des extremites
        private int x1;
        private int y1;
        private int x2;
        private int y2;
     
        // booléean indiquant si la ligne est activée (suite au passage de la souris)
        // dans ce cas, elle se dessinera en rouge
        boolean activated = false;
     
        // constructeur prenant en paramètres les coordonnées des extrémités de la ligne
        public MyLine2(int x1, int y1, int x2, int y2) {
            super(x1, y1, x2, y2);
            this.x1 = x1;
            this.y1 = y1;
            this.x2 = x2;
            this.y2 = y2;
        }
     
        public boolean isActivated() { return this.activated; }
     
        public void setActivated() { this.activated = true; }
     
        public void setNotActivated() { this.activated = false; }
     
        // indique si la distance entre un point (x,y) et le segment est inferieure à lim
        public boolean isCloseFromPoint(int x, int y, int lim) {
            // soit [AB] le segment dessiné, A de coordonnées x1,y1 et B de coordonnées x2,y2
            // soit M un point x,y
            // soit H la projection orthogonale de M sur la droite (AB)
            //   en vecteur : MH.AB = 0
            // soit t le paramètre associé à la position barycentrique de H entre A et B :
            //   en vecteur : t.HA + (1-t).HB = 0
            // après calculs, on obtient :
            //   t = (vect.MB scalaire vect.AB) / AB^2
            double t = ((double) (x2-x)*(x2-x1)+(y2-y)*(y2-y1))/((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
            // ci-dessus : on sait que le diviseur est non nul : c'est vérifié...
            // au moment de la création de la ligne
            // soit d la distance entre le point M et la droite (AB)
            //   d = norme de HM = ... = norme de (en vecteurs) t.MA + (1-t).MB
            double d = Math.sqrt((t*(x1-x)+(1-t)*(x2-x))*(t*(x1-x)+(1-t)*(x2-x))+(t*(y1-y)+(1-t)*(y2-y))*(t*(y1-y)+(1-t)*(y2-y)));
            // on vérifie que t est compris entre 0 et 1 (sinon M peut être proche de la droite (AB)...
            // mais pas du segment [AB]) et que d<=lim
            return ((t>=0) && (t<=1) && (d<=lim));
        }
    }
     
    // classe principale dessinant des lignes, qui changent de couleur quand la souris passe dessus
    public class ListenerOnLine2 extends JComponent implements MouseMotionListener {
     
        // taille de la fenetre
        private final static int dimensionComponent = 400;
     
        // distance limite entre la position de la souris et la ligne
        // en-deçà de laquelle la ligne devient activée
        private final static int limit = 5;
     
        // tableau contenant les lignes
        private final ArrayList<MyLine2> lines = new ArrayList<MyLine2>();
     
        // générateur de nombre aléatoires
        private final Random r = new Random();
     
        // constructeur
        public ListenerOnLine2() {
            this.setPreferredSize(new Dimension(dimensionComponent,dimensionComponent));
            // ajout du listener de déplacement de la souris
            this.addMouseMotionListener(this);
            // ajout du listener de clic sur la souris
            this.addMouseListener(new MouseAdapter() {
                public void mouseClicked(MouseEvent e) {
                    ListenerOnLine2.this.addNewLine();
                }
            }
            );
        }
     
        // rajoute une nouvelle ligne
        public void addNewLine() {
            int x1 = r.nextInt(dimensionComponent);
            int y1 = r.nextInt(dimensionComponent);
            int x2 = r.nextInt(dimensionComponent);
            int y2 = r.nextInt(dimensionComponent);
            if (((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))==0) {
                // le segment est de longueur nulle
                addNewLine();
            } else {
                lines.add(new MyLine2(x1, y1, x2, y2));
                repaint();
            }
        }
     
        public void paint(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;
            g2.setStroke(new BasicStroke(4));
            // dessin des lignes
            for (int i=0; i<lines.size(); i++) {
                if (lines.get(i).isActivated()) {
                    // si la ligne a été "activée" (suite à un passage de la souris)
                    // alors elle est dessinée en rouge
                    g2.setColor(Color.red);
                } else {
                    g2.setColor(Color.blue);
                }
                g2.draw(lines.get(i));
            }
        }
     
        public void mouseMoved(MouseEvent e) {
            int x = e.getX();
            int y = e.getY();
     
            for (int i=0; i<lines.size(); i++) {
                if (lines.get(i).isCloseFromPoint(x, y, limit) && (!lines.get(i).isActivated())) {
                    // si la souris est sur une ligne, et que cette ligne n'est pas encore activée
                    // alors il faut l'activer, et redessiner (elle apparaitra en rouge)
                    lines.get(i).setActivated();
                    repaint();
                }
                if ((lines.get(i).isActivated()) && (!lines.get(i).isCloseFromPoint(x, y, limit))) {
                    // si une ligne est "activée" (suite à un passage de la souris)
                    // mais que la souris n'est plus dessus
                    // alors il faut la désactiver, et redessiner (elle apparaitra en normal)
                    lines.get(i).setNotActivated();
                    repaint();
                }
            }
        }
     
        public void mouseDragged(MouseEvent e) {}
     
        public static void main(String[] args) {
            JFrame frame = new JFrame("Appuyez sur le bouton de la souris pour faire apparaître une nouvelle ligne");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(new ListenerOnLine2());
            frame.pack();
            frame.setVisible(true);
        }
    }

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    merci du code, car je reconnais que l'autre code pris sur un site je l'ai copier coller sans vraiment le comprendre...
    en lisant les commentaires de votre code je me disais que ça allait m'eclairer,
    mais alors franchement :
    // soit [AB] le segment dessiné, A de coordonnées x1,y1 et B de coordonnées x2,y2
    // soit M un point x,y
    // soit H la projection orthogonale de M sur la droite (AB)
    // en vecteur : MH.AB = 0
    // soit t le paramètre associé à la position barycentrique de H entre A et B :
    // en vecteur : t.HA + (1-t).HB = 0
    // après calculs, on obtient :
    // t = (vect.MB scalaire vect.AB) / AB^2
    je n'ai strictement rien compris ( oui vous pouvez rire )
    mais pour moi scalaire/vecteur/projection orthogonale/position barycentrique(<-mon préféré...)
    c'est vraiment chinois...
    tant pis, je vais garder mon code actuel parce-que ce code ( efficace je n'en doute pas... ) est encore moins comprehensible...
    mais merci quand meme .

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Cela m'intéresserait de connaître le code que tu as utilisé dans ton application, ou la référence du site Internet qui t'a inspiré. Histoire de voir toutes les solutions possibles à ce genre de problème.

    Nicolas

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    je te le posterai se soir quand je serais chez moi.
    ( mais attention, je n'ai pas dit qu'il n'est pas compliqué, j'ai juste dit qu'il me semble moins compliqué )

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

Discussions similaires

  1. Changer couleur font label lors du passage du curseur
    Par User Name dans le forum Débuter
    Réponses: 13
    Dernier message: 23/12/2007, 01h20
  2. Changement couleur fond et couleur texte au passage souris
    Par Jiraiya42 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 01/02/2006, 15h18
  3. appliquer une couleur au passage souris sur grpe de cellules
    Par mathieu_r dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/01/2006, 15h20
  4. changer couleur du lien au passage de la sourie
    Par toome dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 01/08/2005, 11h11
  5. Changer la couleur du texte lors passage souris sur un TD !
    Par Kokito dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 10/01/2005, 16h40

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