Commit 0d83ec1e8894bbf732f2e106c54aade9fbf3430f
1 parent
3c9d20ad
tp2 done
Showing
3 changed files
with
226 additions
and
29 deletions
Show diff stats
... | ... | @@ -0,0 +1,174 @@ |
1 | +package tp2.ColorPicker; | |
2 | + | |
3 | +import javax.swing.*; | |
4 | +import javax.swing.event.ChangeEvent; | |
5 | +import javax.swing.event.ChangeListener; | |
6 | +import javax.swing.event.DocumentEvent; | |
7 | +import javax.swing.event.DocumentListener; | |
8 | +import java.awt.*; | |
9 | +import java.awt.event.*; | |
10 | + | |
11 | +public class ColorPicker extends JPanel { | |
12 | + | |
13 | + public static final int padding = 15; | |
14 | + public static final int baseRed = 0; | |
15 | + public static final int baseGreen = 0; | |
16 | + public static final int baseBlue = 0; | |
17 | + public static final int colorMax = 255; | |
18 | + public static final int maxSize = String.valueOf(colorMax).length(); | |
19 | + | |
20 | + Integer r = baseRed; | |
21 | + Integer g = baseGreen; | |
22 | + Integer b = baseBlue; | |
23 | + | |
24 | + JSlider redSlider = new JSlider(0, colorMax, baseRed); | |
25 | + JSlider greenSlider = new JSlider(0, colorMax, baseGreen); | |
26 | + JSlider blueSlider = new JSlider(0, colorMax, baseBlue); | |
27 | + | |
28 | + JTextField redField = new JTextField(Integer.toString(r), maxSize); | |
29 | + JTextField greenField = new JTextField(Integer.toString(g), maxSize); | |
30 | + JTextField blueField = new JTextField(Integer.toString(b), maxSize); | |
31 | + | |
32 | + JTextField colorField = new JTextField(String.format("%02X%02X%02x", r, g, b), 10); | |
33 | + | |
34 | + JPanel colorPan = new JPanel(); | |
35 | + | |
36 | + public class SliderListener extends MouseAdapter { | |
37 | + | |
38 | + @Override | |
39 | + public void mouseReleased(MouseEvent e) { | |
40 | + r = redSlider.getValue(); | |
41 | + g = greenSlider.getValue(); | |
42 | + b = blueSlider.getValue(); | |
43 | + | |
44 | + updateValues(); | |
45 | + } | |
46 | + } | |
47 | + | |
48 | + public class ColorFieldListener extends KeyAdapter { | |
49 | + | |
50 | + @Override | |
51 | + public void keyReleased(KeyEvent e){ | |
52 | + String total = colorField.getText(); | |
53 | + if (total.length() < 6) return; | |
54 | + | |
55 | + String rs = total.substring(0,2); | |
56 | + String gs = total.substring(2,4); | |
57 | + String bs = total.substring(4, 6); | |
58 | + int rv, gv, bv; | |
59 | + | |
60 | + try { | |
61 | + rv = Integer.parseInt(rs, 16); | |
62 | + gv = Integer.parseInt(gs, 16); | |
63 | + bv = Integer.parseInt(bs, 16); | |
64 | + System.out.println("field = "+total); | |
65 | + } catch (NumberFormatException nfe){ | |
66 | + System.out.println("error while parsing"); | |
67 | + return; | |
68 | + } | |
69 | + | |
70 | + r=rv; | |
71 | + g=gv; | |
72 | + b=bv; | |
73 | + updateValues(); | |
74 | + } | |
75 | + } | |
76 | + | |
77 | + public class TextFieldListener extends KeyAdapter { | |
78 | + | |
79 | + @Override | |
80 | + public void keyReleased(KeyEvent e) { | |
81 | + String rs = redField.getText(); | |
82 | + String gs = greenField.getText(); | |
83 | + String bs = blueField.getText(); | |
84 | + int rv, gv, bv; | |
85 | + | |
86 | + try { | |
87 | + rv = Integer.parseInt(rs); | |
88 | + gv = Integer.parseInt(gs); | |
89 | + bv = Integer.parseInt(bs); | |
90 | + } catch (NumberFormatException nfe) { | |
91 | + System.out.println("error parsing"); | |
92 | + return; | |
93 | + } | |
94 | + | |
95 | + if (rv >= 0 && rv <= 255) r = rv; | |
96 | + if (gv >= 0 && gv <= 255) g = gv; | |
97 | + if (bv >= 0 && bv <= 255) b = bv; | |
98 | + | |
99 | + updateValues(); | |
100 | + } | |
101 | + } | |
102 | + | |
103 | + public void updateValues() { | |
104 | + redSlider.setValue(r); | |
105 | + greenSlider.setValue(g); | |
106 | + blueSlider.setValue(b); | |
107 | + | |
108 | + redField.setText(Integer.toString(r)); | |
109 | + greenField.setText(Integer.toString(g)); | |
110 | + blueField.setText(Integer.toString(b)); | |
111 | + | |
112 | + colorField.setText(String.format("%02X%02X%02X", r, g, b)); | |
113 | + | |
114 | + colorPan.setBackground(new Color(r, g, b)); | |
115 | + } | |
116 | + | |
117 | + public ColorPicker() { | |
118 | + super(); | |
119 | + BoxLayout layout = new BoxLayout(this, BoxLayout.X_AXIS); | |
120 | + this.setLayout(layout); | |
121 | + | |
122 | + this.add(Box.createRigidArea(new Dimension(padding, padding))); | |
123 | + | |
124 | + JPanel leftPan = new JPanel(); | |
125 | + BoxLayout leftPanLayout = new BoxLayout(leftPan, BoxLayout.Y_AXIS); | |
126 | + leftPan.setLayout(leftPanLayout); | |
127 | + | |
128 | + this.add(leftPan); | |
129 | + | |
130 | + leftPan.add(Box.createRigidArea(new Dimension(padding, padding))); | |
131 | + | |
132 | + JPanel firstRow = new JPanel(); | |
133 | + firstRow.add(redSlider); | |
134 | + firstRow.add(redField); | |
135 | + leftPan.add(firstRow); | |
136 | + | |
137 | + JPanel secondRow = new JPanel(); | |
138 | + secondRow.add(greenSlider); | |
139 | + secondRow.add(greenField); | |
140 | + leftPan.add(secondRow); | |
141 | + | |
142 | + JPanel thirdRow = new JPanel(); | |
143 | + thirdRow.add(blueSlider); | |
144 | + thirdRow.add(blueField); | |
145 | + leftPan.add(thirdRow); | |
146 | + | |
147 | + redSlider.addMouseListener(new SliderListener()); | |
148 | + greenSlider.addMouseListener(new SliderListener()); | |
149 | + blueSlider.addMouseListener(new SliderListener()); | |
150 | + | |
151 | + redField.addKeyListener(new TextFieldListener()); | |
152 | + greenField.addKeyListener(new TextFieldListener()); | |
153 | + blueField.addKeyListener(new TextFieldListener()); | |
154 | + | |
155 | + colorField.addKeyListener(new ColorFieldListener()); | |
156 | + | |
157 | + leftPan.add(Box.createRigidArea(new Dimension(padding, padding))); | |
158 | + | |
159 | + JPanel rightPan = new JPanel(); | |
160 | + BorderLayout rightPanLayout = new BorderLayout(); | |
161 | + rightPan.setLayout(rightPanLayout); | |
162 | + | |
163 | + rightPan.add(colorField, BorderLayout.NORTH); | |
164 | + | |
165 | + colorPan.setBackground(Color.RED); | |
166 | + rightPan.add(colorPan, BorderLayout.CENTER); | |
167 | + | |
168 | + updateValues(); | |
169 | + | |
170 | + | |
171 | + this.add(rightPan); | |
172 | + } | |
173 | + | |
174 | +} | ... | ... |
src/tp2/ColorPicker/Main.java
... | ... | @@ -5,38 +5,13 @@ import java.awt.*; |
5 | 5 | |
6 | 6 | public class Main { |
7 | 7 | |
8 | + public static final int padding = 15; | |
9 | + | |
8 | 10 | public static void main(String[] args) { |
9 | 11 | JFrame win = new JFrame(); |
10 | - BoxLayout mainLayout = new BoxLayout(win.getContentPane(), BoxLayout.X_AXIS); | |
11 | - win.setLayout(mainLayout); | |
12 | - | |
13 | - JPanel leftPan = new JPanel(); | |
14 | - BoxLayout leftPanLayout = new BoxLayout(leftPan, BoxLayout.Y_AXIS); | |
15 | - leftPan.setLayout(leftPanLayout); | |
16 | - | |
17 | - win.add(leftPan); | |
18 | - | |
19 | - for (int i = 0; i < 3; i++) { | |
20 | - JPanel row = new JPanel(); | |
21 | - JSlider slider = new JSlider(); | |
22 | - JTextField field = new JTextField(3); | |
23 | - row.add(slider); | |
24 | - row.add(field); | |
25 | - leftPan.add(row); | |
26 | - } | |
27 | - | |
28 | - JPanel rightPane = new JPanel(); | |
29 | - BoxLayout rightPaneLayout = new BoxLayout(rightPane, BoxLayout.Y_AXIS); | |
30 | - rightPane.setLayout(rightPaneLayout); | |
31 | - | |
32 | - JTextField hexaColor = new JTextField(); | |
33 | - rightPane.add(hexaColor); | |
34 | - | |
35 | - JPanel color = new JPanel(); | |
36 | - color.setBackground(Color.RED); | |
37 | - rightPane.add(color); | |
38 | 12 | |
39 | - win.add(rightPane); | |
13 | + ColorPicker c = new ColorPicker(); | |
14 | + win.add(c); | |
40 | 15 | |
41 | 16 | win.setLocationRelativeTo(null); |
42 | 17 | win.setResizable(false); | ... | ... |
... | ... | @@ -0,0 +1,48 @@ |
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 | + | ... | ... |