From 0d83ec1e8894bbf732f2e106c54aade9fbf3430f Mon Sep 17 00:00:00 2001 From: shaggy42089 <63241156+shaggy42089@users.noreply.github.com> Date: Fri, 15 Apr 2022 22:18:18 +0200 Subject: [PATCH] tp2 done --- src/tp2/ColorPicker/ColorPicker.java | 174 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/tp2/ColorPicker/Main.java | 33 ++++----------------------------- src/tp2/cr | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 226 insertions(+), 29 deletions(-) create mode 100644 src/tp2/ColorPicker/ColorPicker.java create mode 100644 src/tp2/cr diff --git a/src/tp2/ColorPicker/ColorPicker.java b/src/tp2/ColorPicker/ColorPicker.java new file mode 100644 index 0000000..52b941c --- /dev/null +++ b/src/tp2/ColorPicker/ColorPicker.java @@ -0,0 +1,174 @@ +package tp2.ColorPicker; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import java.awt.*; +import java.awt.event.*; + +public class ColorPicker extends JPanel { + + public static final int padding = 15; + public static final int baseRed = 0; + public static final int baseGreen = 0; + public static final int baseBlue = 0; + public static final int colorMax = 255; + public static final int maxSize = String.valueOf(colorMax).length(); + + Integer r = baseRed; + Integer g = baseGreen; + Integer b = baseBlue; + + JSlider redSlider = new JSlider(0, colorMax, baseRed); + JSlider greenSlider = new JSlider(0, colorMax, baseGreen); + JSlider blueSlider = new JSlider(0, colorMax, baseBlue); + + JTextField redField = new JTextField(Integer.toString(r), maxSize); + JTextField greenField = new JTextField(Integer.toString(g), maxSize); + JTextField blueField = new JTextField(Integer.toString(b), maxSize); + + JTextField colorField = new JTextField(String.format("%02X%02X%02x", r, g, b), 10); + + JPanel colorPan = new JPanel(); + + public class SliderListener extends MouseAdapter { + + @Override + public void mouseReleased(MouseEvent e) { + r = redSlider.getValue(); + g = greenSlider.getValue(); + b = blueSlider.getValue(); + + updateValues(); + } + } + + public class ColorFieldListener extends KeyAdapter { + + @Override + public void keyReleased(KeyEvent e){ + String total = colorField.getText(); + if (total.length() < 6) return; + + String rs = total.substring(0,2); + String gs = total.substring(2,4); + String bs = total.substring(4, 6); + int rv, gv, bv; + + try { + rv = Integer.parseInt(rs, 16); + gv = Integer.parseInt(gs, 16); + bv = Integer.parseInt(bs, 16); + System.out.println("field = "+total); + } catch (NumberFormatException nfe){ + System.out.println("error while parsing"); + return; + } + + r=rv; + g=gv; + b=bv; + updateValues(); + } + } + + public class TextFieldListener extends KeyAdapter { + + @Override + public void keyReleased(KeyEvent e) { + String rs = redField.getText(); + String gs = greenField.getText(); + String bs = blueField.getText(); + int rv, gv, bv; + + try { + rv = Integer.parseInt(rs); + gv = Integer.parseInt(gs); + bv = Integer.parseInt(bs); + } catch (NumberFormatException nfe) { + System.out.println("error parsing"); + return; + } + + if (rv >= 0 && rv <= 255) r = rv; + if (gv >= 0 && gv <= 255) g = gv; + if (bv >= 0 && bv <= 255) b = bv; + + updateValues(); + } + } + + public void updateValues() { + redSlider.setValue(r); + greenSlider.setValue(g); + blueSlider.setValue(b); + + redField.setText(Integer.toString(r)); + greenField.setText(Integer.toString(g)); + blueField.setText(Integer.toString(b)); + + colorField.setText(String.format("%02X%02X%02X", r, g, b)); + + colorPan.setBackground(new Color(r, g, b)); + } + + public ColorPicker() { + super(); + BoxLayout layout = new BoxLayout(this, BoxLayout.X_AXIS); + this.setLayout(layout); + + this.add(Box.createRigidArea(new Dimension(padding, padding))); + + JPanel leftPan = new JPanel(); + BoxLayout leftPanLayout = new BoxLayout(leftPan, BoxLayout.Y_AXIS); + leftPan.setLayout(leftPanLayout); + + this.add(leftPan); + + leftPan.add(Box.createRigidArea(new Dimension(padding, padding))); + + JPanel firstRow = new JPanel(); + firstRow.add(redSlider); + firstRow.add(redField); + leftPan.add(firstRow); + + JPanel secondRow = new JPanel(); + secondRow.add(greenSlider); + secondRow.add(greenField); + leftPan.add(secondRow); + + JPanel thirdRow = new JPanel(); + thirdRow.add(blueSlider); + thirdRow.add(blueField); + leftPan.add(thirdRow); + + redSlider.addMouseListener(new SliderListener()); + greenSlider.addMouseListener(new SliderListener()); + blueSlider.addMouseListener(new SliderListener()); + + redField.addKeyListener(new TextFieldListener()); + greenField.addKeyListener(new TextFieldListener()); + blueField.addKeyListener(new TextFieldListener()); + + colorField.addKeyListener(new ColorFieldListener()); + + leftPan.add(Box.createRigidArea(new Dimension(padding, padding))); + + JPanel rightPan = new JPanel(); + BorderLayout rightPanLayout = new BorderLayout(); + rightPan.setLayout(rightPanLayout); + + rightPan.add(colorField, BorderLayout.NORTH); + + colorPan.setBackground(Color.RED); + rightPan.add(colorPan, BorderLayout.CENTER); + + updateValues(); + + + this.add(rightPan); + } + +} diff --git a/src/tp2/ColorPicker/Main.java b/src/tp2/ColorPicker/Main.java index 7b3da3e..d569c74 100644 --- a/src/tp2/ColorPicker/Main.java +++ b/src/tp2/ColorPicker/Main.java @@ -5,38 +5,13 @@ import java.awt.*; public class Main { + public static final int padding = 15; + public static void main(String[] args) { JFrame win = new JFrame(); - BoxLayout mainLayout = new BoxLayout(win.getContentPane(), BoxLayout.X_AXIS); - win.setLayout(mainLayout); - - JPanel leftPan = new JPanel(); - BoxLayout leftPanLayout = new BoxLayout(leftPan, BoxLayout.Y_AXIS); - leftPan.setLayout(leftPanLayout); - - win.add(leftPan); - - for (int i = 0; i < 3; i++) { - JPanel row = new JPanel(); - JSlider slider = new JSlider(); - JTextField field = new JTextField(3); - row.add(slider); - row.add(field); - leftPan.add(row); - } - - JPanel rightPane = new JPanel(); - BoxLayout rightPaneLayout = new BoxLayout(rightPane, BoxLayout.Y_AXIS); - rightPane.setLayout(rightPaneLayout); - - JTextField hexaColor = new JTextField(); - rightPane.add(hexaColor); - - JPanel color = new JPanel(); - color.setBackground(Color.RED); - rightPane.add(color); - win.add(rightPane); + ColorPicker c = new ColorPicker(); + win.add(c); win.setLocationRelativeTo(null); win.setResizable(false); diff --git a/src/tp2/cr b/src/tp2/cr new file mode 100644 index 0000000..444b6ee --- /dev/null +++ b/src/tp2/cr @@ -0,0 +1,48 @@ +L'intégralité du tp a été réalisé. la suite du compte rendu décrit les difficultés rencontrées. + +Question 1: +Il a été n peu difficile d'obtenir une interface qui ressemble vraiment à l'énoncé car les principes +de setSize et de pack du tp précédent n'avaient pas été bien compris, pour augmenter la taille de la +police de JLabel, il a également fallu chercher un peu sur le net. + +Question 2, 3, 4, 5, 6: +Je n'ai pas vraiment rencontré de difficultés pour ces questions, j'avais déjà fait ce genre de choses auparavant. + +Question 7: +Il y avait un bug au début ou j'avais oublié de mettre +un message par défault pour le label, il n'y avait donc rien d'affiché quand on lançait le programme. + +Question 8: +J'ai beaucoup eu de mal sur cette question car je n'avais pas vu le fichier ArdoiseMagique pour gérer le dessin. +J'ai donc fait mon propre composant ArdoiseMagique ce qui a pris beaucoup de temps. +La tâche était particulièrement difficile car lorsque l'on reste appuyé sur le clic gauche de la souris et +qu'on la déplace, l'évènement correspondant à un déplacement de la souris n'est pas appelé sur chaque pixel, +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) +qui permet de calculer tous les pixel formant une ligne entre deux pixels. Cette solution n'est d'ailleurs pas +la meilleure pour un petit nombre de points car cela relie simplement deux points par une ligne droite et cela donne +un résultat qui ne ressemble pas à la capture d'écran du sujet. + +Question 9: +Pour cette question, je n'arrivais pas à faire en sorte, dans la partie droite de l'interface, +que le JPanel prenne la hauteur restante car j'avais mis un boxlayout au départ, j'ai donc simplement changé pour un +borderlayout avec le champ de texte au dessus et le jpanel au centre. + +Question 10: +Il a été difficile de trouver une architecture "propre" et qui fonctionne pour cette question. +J'ai fini par créer un composant ColorPicker qui hérite de JPanel et auquel j'ai ajouté chaque +élément en attribut ainsi qu'une méthode updateAll qui met à jour l'état de tous les composants +à partir des valeurs r, g et b qui sont aussi des attributs. + +--Listener pour les Sliders +Au départ, j'avais utilisé un ChangeListener pour détecter lorsque l'utilisateur change la valeur. +J'ai finalement opté pour un MouseAdapter car la methode stateChanged était appelée à chaque fois que l'on +changeait la valeur du slider ce qui pouvait occasioner des bugs voire des boucles infinies lorsque l'on change +plusieurs composantes à la fois (r, g, b). + +--Listener pour les champs de texte +j'avais au départ trouvé une solution qui consistait à utiliser des DocumentListener +Mais cette solution comportait le même problème que pour les slider. +J'ai donc opté pour un KeyBoardAdapter où j'ai redéfini la méthode keyReleased, +l'actualisation de l'interface se fait donc lorsque l'on relâche une touche. + -- libgit2 0.21.2