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...)
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...)
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
ah oui, mais faut connaitre les bon mots clefs
je vais regarder merci...
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 )
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); } }
bonjour,
non, en fait je passais le graphics2D a la fonction traceLesLignes() et je fesait directement drawline,Les lignes sont rajoutées dynamiquement, mais tu en gardes bien trace quelque part, ne serait-ce que pour les dessiner, non ?
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 ?
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
ah d'accord, c'est juste pour ne pas avoir a caster en fait.
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); } }
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 :
je n'ai strictement rien compris ( oui vous pouvez rire )// 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
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 .
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
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é )
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager