Commit 5d736557aa53f207d786bd98c560a0ffb5390ce1
1 parent
0d83ec1e
tp2 done
Showing
8 changed files
with
264 additions
and
107 deletions
Show diff stats
src/tp2/ArdoiseMagique/Ardoise.java
src/tp2/ArdoiseMagique/ArdoiseMagique.java
1 | -package tp2.ArdoiseMagique; | |
1 | +package tp2.ArdoiseMagique; /** | |
2 | + * ArdoiseMagique.java | |
3 | + * | |
4 | + * @author <a href="mailto:gery.casiez@lifl.fr">Gery Casiez</a> | |
5 | + * @version | |
6 | + */ | |
2 | 7 | |
3 | -import javax.swing.*; | |
4 | 8 | import java.awt.*; |
5 | -import java.awt.event.*; | |
6 | - | |
7 | -public class ArdoiseMagique extends JFrame { | |
8 | - | |
9 | - public ArdoiseMagique() { | |
10 | - super(); | |
11 | - this.setLocationRelativeTo(null); | |
12 | - | |
13 | - Ardoise ard = new Ardoise(); | |
14 | - ard.addMouseMotionListener(new MouseMotionAdapter() { | |
15 | - @Override | |
16 | - public void mouseDragged(MouseEvent e) { | |
17 | - super.mouseDragged(e); | |
18 | - Ardoise a = (Ardoise) e.getSource(); | |
19 | - if (SwingUtilities.isLeftMouseButton(e)) { | |
20 | - a.setPixel( | |
21 | - e.getX(), | |
22 | - e.getY(), | |
23 | - Ardoise.BLACK | |
24 | - ); | |
25 | - } else if (SwingUtilities.isRightMouseButton(e)) { | |
26 | - a.wipe(); | |
27 | - } | |
28 | - } | |
29 | - }); | |
30 | - | |
31 | - ard.addMouseListener(new MouseAdapter() { | |
32 | - @Override | |
33 | - public void mouseReleased(MouseEvent e) { | |
34 | - Ardoise src = (Ardoise) e.getSource(); | |
35 | - if (SwingUtilities.isLeftMouseButton(e)) { | |
36 | - src.resetOld(); | |
37 | - } else if (SwingUtilities.isRightMouseButton(e)){ | |
38 | - src.wipe(); | |
39 | - } | |
40 | - } | |
41 | - }); | |
42 | - ard.setPreferredSize(new Dimension(1000,600)); | |
43 | - this.add(ard); | |
44 | - | |
45 | - this.setResizable(false); | |
46 | - this.pack(); | |
47 | - | |
48 | - this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | |
49 | - this.setVisible(true); | |
50 | - } | |
9 | +import javax.swing.*; | |
10 | +import java.util.ArrayList; | |
11 | +import java.util.Iterator; | |
51 | 12 | |
52 | - public static void main(String[] args) { | |
53 | - new ArdoiseMagique(); | |
54 | - } | |
13 | +class Point { | |
14 | + public Integer x,y; | |
15 | + | |
16 | + Point() { | |
17 | + x = 0; | |
18 | + y = 0; | |
19 | + } | |
20 | + | |
21 | + Point(Integer x, Integer y) { | |
22 | + this.x = x; | |
23 | + this.y = y; | |
24 | + } | |
25 | +} | |
26 | + | |
27 | +class Curve { | |
28 | + public ArrayList<Point> points; | |
29 | + | |
30 | + Curve() { | |
31 | + points = new ArrayList<Point>(); | |
32 | + } | |
33 | + | |
34 | + public void addPoint(Point P) { | |
35 | + points.add(P); | |
36 | + } | |
37 | + | |
38 | + public void clear() { | |
39 | + points.clear(); | |
40 | + } | |
41 | +} | |
55 | 42 | |
43 | +public class ArdoiseMagique extends JPanel { | |
44 | + private ArrayList<Curve> curves; | |
45 | + | |
46 | + public ArdoiseMagique(){ | |
47 | + curves = new ArrayList<Curve>(); | |
48 | + curves.add(new Curve()); | |
49 | + setBackground(Color.white); | |
50 | + } | |
51 | + | |
52 | + public void addPoint(Integer x, Integer y) { | |
53 | + curves.get(curves.size()-1).addPoint(new Point(x,y)); | |
54 | + repaint(); | |
55 | + } | |
56 | + | |
57 | + public void newCurve() { | |
58 | + curves.add(new Curve()); | |
59 | + } | |
60 | + | |
61 | + public void clear() { | |
62 | + curves.clear(); | |
63 | + curves.add(new Curve()); | |
64 | + repaint(); | |
65 | + } | |
66 | + | |
67 | + public void paintComponent(Graphics g) { | |
68 | + Point Pprev, Pcurrent; | |
69 | + super.paintComponent(g); | |
70 | + | |
71 | + Iterator<Curve> itcurve = curves.iterator(); | |
72 | + | |
73 | + Pprev = new Point(); | |
74 | + | |
75 | + // Pour chaque courbe | |
76 | + while (itcurve.hasNext()) { | |
77 | + Iterator<Point> it = itcurve.next().points.iterator(); | |
78 | + | |
79 | + if (it.hasNext()) { | |
80 | + Pprev = it.next(); | |
81 | + } | |
82 | + | |
83 | + // Dessine les points d'une courbe | |
84 | + while (it.hasNext()) { | |
85 | + Pcurrent = it.next(); | |
86 | + g.drawLine(Pprev.x,Pprev.y, Pcurrent.x, Pcurrent.y); | |
87 | + Pprev = Pcurrent; | |
88 | + } | |
89 | + } | |
90 | + } | |
56 | 91 | } | ... | ... |
... | ... | @@ -0,0 +1,56 @@ |
1 | +package tp2.ArdoiseMagique; | |
2 | + | |
3 | +import javax.swing.*; | |
4 | +import java.awt.*; | |
5 | +import java.awt.event.*; | |
6 | + | |
7 | +public class Main extends JFrame { | |
8 | + | |
9 | + public Main() { | |
10 | + super(); | |
11 | + this.setLocationRelativeTo(null); | |
12 | + | |
13 | + Ardoise ard = new Ardoise(); | |
14 | + ard.addMouseMotionListener(new MouseMotionAdapter() { | |
15 | + @Override | |
16 | + public void mouseDragged(MouseEvent e) { | |
17 | + super.mouseDragged(e); | |
18 | + Ardoise a = (Ardoise) e.getSource(); | |
19 | + if (SwingUtilities.isLeftMouseButton(e)) { | |
20 | + a.setPixel( | |
21 | + e.getX(), | |
22 | + e.getY(), | |
23 | + Ardoise.BLACK | |
24 | + ); | |
25 | + } else if (SwingUtilities.isRightMouseButton(e)) { | |
26 | + a.wipe(); | |
27 | + } | |
28 | + } | |
29 | + }); | |
30 | + | |
31 | + ard.addMouseListener(new MouseAdapter() { | |
32 | + @Override | |
33 | + public void mouseReleased(MouseEvent e) { | |
34 | + Ardoise src = (Ardoise) e.getSource(); | |
35 | + if (SwingUtilities.isLeftMouseButton(e)) { | |
36 | + src.resetOld(); | |
37 | + } else if (SwingUtilities.isRightMouseButton(e)){ | |
38 | + src.wipe(); | |
39 | + } | |
40 | + } | |
41 | + }); | |
42 | + ard.setPreferredSize(new Dimension(1000,600)); | |
43 | + this.add(ard); | |
44 | + | |
45 | + this.setResizable(false); | |
46 | + this.pack(); | |
47 | + | |
48 | + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | |
49 | + this.setVisible(true); | |
50 | + } | |
51 | + | |
52 | + public static void main(String[] args) { | |
53 | + new Main(); | |
54 | + } | |
55 | + | |
56 | +} | ... | ... |
... | ... | @@ -0,0 +1,57 @@ |
1 | +package tp2.ArdoiseMagique; | |
2 | + | |
3 | +import javax.swing.*; | |
4 | +import java.awt.*; | |
5 | +import java.awt.event.MouseAdapter; | |
6 | +import java.awt.event.MouseEvent; | |
7 | +import java.awt.event.MouseMotionAdapter; | |
8 | + | |
9 | +public class Main2 extends JFrame { | |
10 | + | |
11 | + public Main2 () { | |
12 | + super(); | |
13 | + this.setLocationRelativeTo(null); | |
14 | + | |
15 | + ArdoiseMagique ard = new ArdoiseMagique(); | |
16 | + ard.addMouseMotionListener(new MouseMotionAdapter() { | |
17 | + @Override | |
18 | + public void mouseDragged(MouseEvent e) { | |
19 | + super.mouseDragged(e); | |
20 | + ArdoiseMagique a = (ArdoiseMagique) e.getSource(); | |
21 | + if (SwingUtilities.isLeftMouseButton(e)) { | |
22 | + a.addPoint( | |
23 | + e.getX(), | |
24 | + e.getY() | |
25 | + ); | |
26 | + } else if (SwingUtilities.isRightMouseButton(e)) { | |
27 | + a.clear(); | |
28 | + } | |
29 | + } | |
30 | + }); | |
31 | + | |
32 | + ard.addMouseListener(new MouseAdapter() { | |
33 | + @Override | |
34 | + public void mouseReleased(MouseEvent e) { | |
35 | + ArdoiseMagique src = (ArdoiseMagique) e.getSource(); | |
36 | + if (SwingUtilities.isLeftMouseButton(e)) { | |
37 | + src.newCurve(); | |
38 | + } else if (SwingUtilities.isRightMouseButton(e)){ | |
39 | + src.clear(); | |
40 | + } | |
41 | + } | |
42 | + }); | |
43 | + ard.setPreferredSize(new Dimension(1000,600)); | |
44 | + this.add(ard); | |
45 | + | |
46 | + this.setResizable(false); | |
47 | + this.pack(); | |
48 | + | |
49 | + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | |
50 | + this.setVisible(true); | |
51 | + } | |
52 | + | |
53 | + | |
54 | + public static void main(String[] args) { | |
55 | + new Main2(); | |
56 | + } | |
57 | +} | ... | ... |
src/tp2/cr deleted
... | ... | @@ -1,48 +0,0 @@ |
1 | -L'intégralité du tp a été réalisé. la suite du compte rendu décrit les difficultés rencontrées. | |
2 | - | |
3 | -Question 1: | |
4 | -Il a été n peu difficile d'obtenir une interface qui ressemble vraiment à l'énoncé car les principes | |
5 | -de setSize et de pack du tp précédent n'avaient pas été bien compris, pour augmenter la taille de la | |
6 | -police de JLabel, il a également fallu chercher un peu sur le net. | |
7 | - | |
8 | -Question 2, 3, 4, 5, 6: | |
9 | -Je n'ai pas vraiment rencontré de difficultés pour ces questions, j'avais déjà fait ce genre de choses auparavant. | |
10 | - | |
11 | -Question 7: | |
12 | -Il y avait un bug au début ou j'avais oublié de mettre | |
13 | -un message par défault pour le label, il n'y avait donc rien d'affiché quand on lançait le programme. | |
14 | - | |
15 | -Question 8: | |
16 | -J'ai beaucoup eu de mal sur cette question car je n'avais pas vu le fichier ArdoiseMagique pour gérer le dessin. | |
17 | -J'ai donc fait mon propre composant ArdoiseMagique ce qui a pris beaucoup de temps. | |
18 | -La tâche était particulièrement difficile car lorsque l'on reste appuyé sur le clic gauche de la souris et | |
19 | -qu'on la déplace, l'évènement correspondant à un déplacement de la souris n'est pas appelé sur chaque pixel, | |
20 | -il faut donc faire de l'interpolation. j'ai donc utilisé l'algorithme | |
21 | -de la ligne de Bresenhan (https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm) | |
22 | -qui permet de calculer tous les pixel formant une ligne entre deux pixels. Cette solution n'est d'ailleurs pas | |
23 | -la meilleure pour un petit nombre de points car cela relie simplement deux points par une ligne droite et cela donne | |
24 | -un résultat qui ne ressemble pas à la capture d'écran du sujet. | |
25 | - | |
26 | -Question 9: | |
27 | -Pour cette question, je n'arrivais pas à faire en sorte, dans la partie droite de l'interface, | |
28 | -que le JPanel prenne la hauteur restante car j'avais mis un boxlayout au départ, j'ai donc simplement changé pour un | |
29 | -borderlayout avec le champ de texte au dessus et le jpanel au centre. | |
30 | - | |
31 | -Question 10: | |
32 | -Il a été difficile de trouver une architecture "propre" et qui fonctionne pour cette question. | |
33 | -J'ai fini par créer un composant ColorPicker qui hérite de JPanel et auquel j'ai ajouté chaque | |
34 | -élément en attribut ainsi qu'une méthode updateAll qui met à jour l'état de tous les composants | |
35 | -à partir des valeurs r, g et b qui sont aussi des attributs. | |
36 | - | |
37 | ---Listener pour les Sliders | |
38 | -Au départ, j'avais utilisé un ChangeListener pour détecter lorsque l'utilisateur change la valeur. | |
39 | -J'ai finalement opté pour un MouseAdapter car la methode stateChanged était appelée à chaque fois que l'on | |
40 | -changeait la valeur du slider ce qui pouvait occasioner des bugs voire des boucles infinies lorsque l'on change | |
41 | -plusieurs composantes à la fois (r, g, b). | |
42 | - | |
43 | ---Listener pour les champs de texte | |
44 | -j'avais au départ trouvé une solution qui consistait à utiliser des DocumentListener | |
45 | -Mais cette solution comportait le même problème que pour les slider. | |
46 | -J'ai donc opté pour un KeyBoardAdapter où j'ai redéfini la méthode keyReleased, | |
47 | -l'actualisation de l'interface se fait donc lorsque l'on relâche une touche. | |
48 | - |
... | ... | @@ -0,0 +1,59 @@ |
1 | +### L'intégralité du tp a été réalisé. la suite du compte rendu décrit les difficultés rencontrées. | |
2 | + | |
3 | + | |
4 | +# Évènements | |
5 | +## Question 1: | |
6 | +Il a été un peu difficile d'obtenir une interface qui ressemble vraiment à l'énoncé car les principes | |
7 | +de setSize et de pack du tp précédent n'avaient pas été bien compris, pour augmenter la taille de la | |
8 | +police du JLabel, il a également fallu chercher un peu sur le net. | |
9 | + | |
10 | +## Question 2, 3, 4, 5, 6: | |
11 | +Je n'ai pas vraiment rencontré de difficultés pour ces questions, j'avais déjà fait ce genre de choses auparavant. | |
12 | + | |
13 | +# Méthode getSource | |
14 | +## Question 7: | |
15 | +Je n'avais pas mis de texte au départ pour le JLabel, lors du pack(), | |
16 | +la JFrame a donc alloué tout l'espace aux 3 boutons. Par conséquent, lorsque l'on clique | |
17 | +sur un bouton pour la première fois, le JLabel prend subitement de la place ce qui a pour effet de décaler | |
18 | +les boutons vers le bas ce qui les rends inaccessibles. J'ai résolu ce problème en mettant " " comme texte | |
19 | +par défaut au JLabel avant d'appeler pack(). | |
20 | +On aurait aussi pu rendre la fenêtre redimensonnable. | |
21 | + | |
22 | +# Aplication : Ardoise magique | |
23 | +## Question 8: | |
24 | +J'ai beaucoup eu de mal sur cette question car je n'avais pas vu au départ le fichier ArdoiseMagique donné avec | |
25 | +le sujet pour gérer le dessin. J'ai donc fait mon propre composant Ardoise ce qui a pris beaucoup de temps. | |
26 | +La tâche était particulièrement difficile car lorsque l'on reste appuyé sur le clic gauche de la souris et | |
27 | +qu'on la déplace, l'évènement correspondant à un déplacement de la souris n'est pas appelé sur chaque pixel, | |
28 | +il faut donc faire de l'interpolation. j'ai donc utilisé l'algorithme de la ligne de Bresenhan (https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm) | |
29 | +qui permet de calculer tous les pixel formant une ligne entre deux pixels. Cette solution n'est d'ailleurs pas | |
30 | +la meilleure pour un petit nombre de points car cela relie simplement deux points par une ligne droite et cela donne | |
31 | +un résultat qui ne ressemble pas à la capture d'écran du sujet. | |
32 | + | |
33 | +Au final j'ai fait une deuxième version dans Main2 qui utilise le fichier donnée avec le sujet | |
34 | +et le résultat fonctionne comme prévu. | |
35 | + | |
36 | +# Sélecteur de couleur | |
37 | +## Question 9: | |
38 | +Pour cette question, je n'arrivais pas à faire en sorte, dans la partie droite de l'interface, | |
39 | +que le JPanel prenne toute la hauteur disponible car j'avais mis un boxlayout au départ, j'ai donc simplement changé pour un | |
40 | +borderlayout avec le champ de texte au dessus et le jpanel au centre. | |
41 | + | |
42 | +## Question 10: | |
43 | +Il a été difficile de trouver une architecture "propre" et qui fonctionne pour cette question. | |
44 | +J'ai fini par créer un composant ColorPicker qui hérite de JPanel et auquel j'ai ajouté chaque | |
45 | +élément en attribut ainsi qu'une méthode updateAll qui met à jour l'état de tous les composants | |
46 | +à partir des valeurs r, g et b qui sont aussi des attributs. | |
47 | + | |
48 | +### Listener pour les Sliders | |
49 | +Au départ, j'avais utilisé un ChangeListener pour détecter lorsque l'utilisateur change la valeur. | |
50 | +J'ai finalement opté pour un MouseAdapter car la méthode stateChanged était appelée à chaque fois que l'on | |
51 | +changeait la valeur du slider ce qui pouvait occasioner des bugs voire des boucles infinies lorsque l'on changeait | |
52 | +plusieurs composantes (r, g, b) à la fois. | |
53 | + | |
54 | +### Listener pour les champs de texte | |
55 | +j'avais au départ trouvé une solution qui consistait à utiliser des DocumentListener | |
56 | +Mais cette solution comportait le même problème que pour les slider. | |
57 | +J'ai donc opté pour un KeyBoardAdapter où j'ai redéfini la méthode keyReleased, | |
58 | +l'actualisation de l'interface se fait donc lorsque l'on relâche une touche. | |
59 | + | ... | ... |
src/tp2/evenements/FenetreIncrementer.java
src/tp2/getSource/MultiButt.java
... | ... | @@ -16,18 +16,18 @@ public class MultiButt extends JFrame { |
16 | 16 | BoxLayout layout = new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS); |
17 | 17 | this.setLayout(layout); |
18 | 18 | |
19 | - this.label = new JLabel("Bouton 0"); | |
19 | + this.label = new JLabel(" "); | |
20 | 20 | label.setFont(new Font("SansSerif", Font.PLAIN, 25)); |
21 | 21 | |
22 | 22 | JPanel topPanel = new JPanel(); |
23 | 23 | topPanel.add(label); |
24 | 24 | this.add(topPanel); |
25 | 25 | |
26 | - ActionListener listener = new ReponseAuClic2(); | |
26 | + ActionListener listener = new ClicListener(); | |
27 | 27 | |
28 | 28 | for (int i = 0;i < nbButtons; ++i){ |
29 | 29 | JPanel tmp = new JPanel(); |
30 | - JButton butt = new JButton("Bouton "+Integer.toString(i)); | |
30 | + JButton butt = new JButton("Bouton "+ i); | |
31 | 31 | butt.addActionListener(listener); |
32 | 32 | tmp.add(butt); |
33 | 33 | this.add(tmp); |
... | ... | @@ -40,9 +40,9 @@ public class MultiButt extends JFrame { |
40 | 40 | this.setVisible(true); |
41 | 41 | } |
42 | 42 | |
43 | - private class ReponseAuClic2 implements ActionListener { | |
43 | + private class ClicListener implements ActionListener { | |
44 | 44 | |
45 | - public ReponseAuClic2() { | |
45 | + public ClicListener() { | |
46 | 46 | } |
47 | 47 | |
48 | 48 | @Override | ... | ... |