Commit 0d83ec1e8894bbf732f2e106c54aade9fbf3430f

Authored by shaggy42089
1 parent 3c9d20ad

tp2 done

src/tp2/ColorPicker/ColorPicker.java 0 → 100644
... ... @@ -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);
... ...
src/tp2/cr 0 → 100644
... ... @@ -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 +
... ...