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
@@ -46,7 +46,6 @@ public class Ardoise extends JPanel { | @@ -46,7 +46,6 @@ public class Ardoise extends JPanel { | ||
46 | oldx = x; | 46 | oldx = x; |
47 | oldy = y; | 47 | oldy = y; |
48 | 48 | ||
49 | - System.out.println("tried to put a "+(color==BLACK?"black":"white")+" pixel at "+Integer.toString(x)+" "+Integer.toString(x)); | ||
50 | pixelArray[x][y] = color; | 49 | pixelArray[x][y] = color; |
51 | repaint(); | 50 | repaint(); |
52 | } | 51 | } |
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 | import java.awt.*; | 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 @@ | @@ -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 @@ | @@ -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,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 @@ | @@ -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
@@ -48,8 +48,7 @@ public class FenetreIncrementer extends JFrame{ | @@ -48,8 +48,7 @@ public class FenetreIncrementer extends JFrame{ | ||
48 | 48 | ||
49 | private class ReponseAuClic implements ActionListener { | 49 | private class ReponseAuClic implements ActionListener { |
50 | 50 | ||
51 | - public ReponseAuClic() { | ||
52 | - } | 51 | + public ReponseAuClic() {} |
53 | 52 | ||
54 | @Override | 53 | @Override |
55 | public void actionPerformed(ActionEvent e) { | 54 | public void actionPerformed(ActionEvent e) { |
src/tp2/getSource/MultiButt.java
@@ -16,18 +16,18 @@ public class MultiButt extends JFrame { | @@ -16,18 +16,18 @@ public class MultiButt extends JFrame { | ||
16 | BoxLayout layout = new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS); | 16 | BoxLayout layout = new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS); |
17 | this.setLayout(layout); | 17 | this.setLayout(layout); |
18 | 18 | ||
19 | - this.label = new JLabel("Bouton 0"); | 19 | + this.label = new JLabel(" "); |
20 | label.setFont(new Font("SansSerif", Font.PLAIN, 25)); | 20 | label.setFont(new Font("SansSerif", Font.PLAIN, 25)); |
21 | 21 | ||
22 | JPanel topPanel = new JPanel(); | 22 | JPanel topPanel = new JPanel(); |
23 | topPanel.add(label); | 23 | topPanel.add(label); |
24 | this.add(topPanel); | 24 | this.add(topPanel); |
25 | 25 | ||
26 | - ActionListener listener = new ReponseAuClic2(); | 26 | + ActionListener listener = new ClicListener(); |
27 | 27 | ||
28 | for (int i = 0;i < nbButtons; ++i){ | 28 | for (int i = 0;i < nbButtons; ++i){ |
29 | JPanel tmp = new JPanel(); | 29 | JPanel tmp = new JPanel(); |
30 | - JButton butt = new JButton("Bouton "+Integer.toString(i)); | 30 | + JButton butt = new JButton("Bouton "+ i); |
31 | butt.addActionListener(listener); | 31 | butt.addActionListener(listener); |
32 | tmp.add(butt); | 32 | tmp.add(butt); |
33 | this.add(tmp); | 33 | this.add(tmp); |
@@ -40,9 +40,9 @@ public class MultiButt extends JFrame { | @@ -40,9 +40,9 @@ public class MultiButt extends JFrame { | ||
40 | this.setVisible(true); | 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 | @Override | 48 | @Override |