From 5d736557aa53f207d786bd98c560a0ffb5390ce1 Mon Sep 17 00:00:00 2001 From: shaggy42089 <63241156+shaggy42089@users.noreply.github.com> Date: Sun, 24 Apr 2022 00:56:44 +0200 Subject: [PATCH] tp2 done --- src/tp2/ArdoiseMagique/Ardoise.java | 1 - src/tp2/ArdoiseMagique/ArdoiseMagique.java | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------------------- src/tp2/ArdoiseMagique/Main.java | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/tp2/ArdoiseMagique/Main2.java | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/tp2/cr | 48 ------------------------------------------------ src/tp2/cr.md | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/tp2/evenements/FenetreIncrementer.java | 3 +-- src/tp2/getSource/MultiButt.java | 10 +++++----- 8 files changed, 264 insertions(+), 107 deletions(-) create mode 100644 src/tp2/ArdoiseMagique/Main.java create mode 100644 src/tp2/ArdoiseMagique/Main2.java delete mode 100644 src/tp2/cr create mode 100644 src/tp2/cr.md diff --git a/src/tp2/ArdoiseMagique/Ardoise.java b/src/tp2/ArdoiseMagique/Ardoise.java index 1492247..46e2f64 100644 --- a/src/tp2/ArdoiseMagique/Ardoise.java +++ b/src/tp2/ArdoiseMagique/Ardoise.java @@ -46,7 +46,6 @@ public class Ardoise extends JPanel { oldx = x; oldy = y; - System.out.println("tried to put a "+(color==BLACK?"black":"white")+" pixel at "+Integer.toString(x)+" "+Integer.toString(x)); pixelArray[x][y] = color; repaint(); } diff --git a/src/tp2/ArdoiseMagique/ArdoiseMagique.java b/src/tp2/ArdoiseMagique/ArdoiseMagique.java index 6306416..5e49b8a 100644 --- a/src/tp2/ArdoiseMagique/ArdoiseMagique.java +++ b/src/tp2/ArdoiseMagique/ArdoiseMagique.java @@ -1,56 +1,91 @@ -package tp2.ArdoiseMagique; +package tp2.ArdoiseMagique; /** + * ArdoiseMagique.java + * + * @author Gery Casiez + * @version + */ -import javax.swing.*; import java.awt.*; -import java.awt.event.*; - -public class ArdoiseMagique extends JFrame { - - public ArdoiseMagique() { - super(); - this.setLocationRelativeTo(null); - - Ardoise ard = new Ardoise(); - ard.addMouseMotionListener(new MouseMotionAdapter() { - @Override - public void mouseDragged(MouseEvent e) { - super.mouseDragged(e); - Ardoise a = (Ardoise) e.getSource(); - if (SwingUtilities.isLeftMouseButton(e)) { - a.setPixel( - e.getX(), - e.getY(), - Ardoise.BLACK - ); - } else if (SwingUtilities.isRightMouseButton(e)) { - a.wipe(); - } - } - }); - - ard.addMouseListener(new MouseAdapter() { - @Override - public void mouseReleased(MouseEvent e) { - Ardoise src = (Ardoise) e.getSource(); - if (SwingUtilities.isLeftMouseButton(e)) { - src.resetOld(); - } else if (SwingUtilities.isRightMouseButton(e)){ - src.wipe(); - } - } - }); - ard.setPreferredSize(new Dimension(1000,600)); - this.add(ard); - - this.setResizable(false); - this.pack(); - - this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - this.setVisible(true); - } +import javax.swing.*; +import java.util.ArrayList; +import java.util.Iterator; - public static void main(String[] args) { - new ArdoiseMagique(); - } +class Point { + public Integer x,y; + + Point() { + x = 0; + y = 0; + } + + Point(Integer x, Integer y) { + this.x = x; + this.y = y; + } +} + +class Curve { + public ArrayList points; + + Curve() { + points = new ArrayList(); + } + + public void addPoint(Point P) { + points.add(P); + } + + public void clear() { + points.clear(); + } +} +public class ArdoiseMagique extends JPanel { + private ArrayList curves; + + public ArdoiseMagique(){ + curves = new ArrayList(); + curves.add(new Curve()); + setBackground(Color.white); + } + + public void addPoint(Integer x, Integer y) { + curves.get(curves.size()-1).addPoint(new Point(x,y)); + repaint(); + } + + public void newCurve() { + curves.add(new Curve()); + } + + public void clear() { + curves.clear(); + curves.add(new Curve()); + repaint(); + } + + public void paintComponent(Graphics g) { + Point Pprev, Pcurrent; + super.paintComponent(g); + + Iterator itcurve = curves.iterator(); + + Pprev = new Point(); + + // Pour chaque courbe + while (itcurve.hasNext()) { + Iterator it = itcurve.next().points.iterator(); + + if (it.hasNext()) { + Pprev = it.next(); + } + + // Dessine les points d'une courbe + while (it.hasNext()) { + Pcurrent = it.next(); + g.drawLine(Pprev.x,Pprev.y, Pcurrent.x, Pcurrent.y); + Pprev = Pcurrent; + } + } + } } diff --git a/src/tp2/ArdoiseMagique/Main.java b/src/tp2/ArdoiseMagique/Main.java new file mode 100644 index 0000000..fe36d37 --- /dev/null +++ b/src/tp2/ArdoiseMagique/Main.java @@ -0,0 +1,56 @@ +package tp2.ArdoiseMagique; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; + +public class Main extends JFrame { + + public Main() { + super(); + this.setLocationRelativeTo(null); + + Ardoise ard = new Ardoise(); + ard.addMouseMotionListener(new MouseMotionAdapter() { + @Override + public void mouseDragged(MouseEvent e) { + super.mouseDragged(e); + Ardoise a = (Ardoise) e.getSource(); + if (SwingUtilities.isLeftMouseButton(e)) { + a.setPixel( + e.getX(), + e.getY(), + Ardoise.BLACK + ); + } else if (SwingUtilities.isRightMouseButton(e)) { + a.wipe(); + } + } + }); + + ard.addMouseListener(new MouseAdapter() { + @Override + public void mouseReleased(MouseEvent e) { + Ardoise src = (Ardoise) e.getSource(); + if (SwingUtilities.isLeftMouseButton(e)) { + src.resetOld(); + } else if (SwingUtilities.isRightMouseButton(e)){ + src.wipe(); + } + } + }); + ard.setPreferredSize(new Dimension(1000,600)); + this.add(ard); + + this.setResizable(false); + this.pack(); + + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + this.setVisible(true); + } + + public static void main(String[] args) { + new Main(); + } + +} diff --git a/src/tp2/ArdoiseMagique/Main2.java b/src/tp2/ArdoiseMagique/Main2.java new file mode 100644 index 0000000..955b2aa --- /dev/null +++ b/src/tp2/ArdoiseMagique/Main2.java @@ -0,0 +1,57 @@ +package tp2.ArdoiseMagique; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionAdapter; + +public class Main2 extends JFrame { + + public Main2 () { + super(); + this.setLocationRelativeTo(null); + + ArdoiseMagique ard = new ArdoiseMagique(); + ard.addMouseMotionListener(new MouseMotionAdapter() { + @Override + public void mouseDragged(MouseEvent e) { + super.mouseDragged(e); + ArdoiseMagique a = (ArdoiseMagique) e.getSource(); + if (SwingUtilities.isLeftMouseButton(e)) { + a.addPoint( + e.getX(), + e.getY() + ); + } else if (SwingUtilities.isRightMouseButton(e)) { + a.clear(); + } + } + }); + + ard.addMouseListener(new MouseAdapter() { + @Override + public void mouseReleased(MouseEvent e) { + ArdoiseMagique src = (ArdoiseMagique) e.getSource(); + if (SwingUtilities.isLeftMouseButton(e)) { + src.newCurve(); + } else if (SwingUtilities.isRightMouseButton(e)){ + src.clear(); + } + } + }); + ard.setPreferredSize(new Dimension(1000,600)); + this.add(ard); + + this.setResizable(false); + this.pack(); + + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + this.setVisible(true); + } + + + public static void main(String[] args) { + new Main2(); + } +} diff --git a/src/tp2/cr b/src/tp2/cr deleted file mode 100644 index 444b6ee..0000000 --- a/src/tp2/cr +++ /dev/null @@ -1,48 +0,0 @@ -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. - diff --git a/src/tp2/cr.md b/src/tp2/cr.md new file mode 100644 index 0000000..dc6e098 --- /dev/null +++ b/src/tp2/cr.md @@ -0,0 +1,59 @@ +### L'intégralité du tp a été réalisé. la suite du compte rendu décrit les difficultés rencontrées. + + +# Évènements +## Question 1: +Il a été un 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 du 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. + +# Méthode getSource +## Question 7: +Je n'avais pas mis de texte au départ pour le JLabel, lors du pack(), +la JFrame a donc alloué tout l'espace aux 3 boutons. Par conséquent, lorsque l'on clique +sur un bouton pour la première fois, le JLabel prend subitement de la place ce qui a pour effet de décaler +les boutons vers le bas ce qui les rends inaccessibles. J'ai résolu ce problème en mettant " " comme texte +par défaut au JLabel avant d'appeler pack(). +On aurait aussi pu rendre la fenêtre redimensonnable. + +# Aplication : Ardoise magique +## Question 8: +J'ai beaucoup eu de mal sur cette question car je n'avais pas vu au départ le fichier ArdoiseMagique donné avec +le sujet pour gérer le dessin. J'ai donc fait mon propre composant Ardoise 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. + +Au final j'ai fait une deuxième version dans Main2 qui utilise le fichier donnée avec le sujet +et le résultat fonctionne comme prévu. + +# Sélecteur de couleur +## Question 9: +Pour cette question, je n'arrivais pas à faire en sorte, dans la partie droite de l'interface, +que le JPanel prenne toute la hauteur disponible 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 méthode 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 changeait +plusieurs composantes (r, g, b) à la fois. + +### 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. + diff --git a/src/tp2/evenements/FenetreIncrementer.java b/src/tp2/evenements/FenetreIncrementer.java index c32973a..543892f 100644 --- a/src/tp2/evenements/FenetreIncrementer.java +++ b/src/tp2/evenements/FenetreIncrementer.java @@ -48,8 +48,7 @@ public class FenetreIncrementer extends JFrame{ private class ReponseAuClic implements ActionListener { - public ReponseAuClic() { - } + public ReponseAuClic() {} @Override public void actionPerformed(ActionEvent e) { diff --git a/src/tp2/getSource/MultiButt.java b/src/tp2/getSource/MultiButt.java index 059ff14..8913d28 100644 --- a/src/tp2/getSource/MultiButt.java +++ b/src/tp2/getSource/MultiButt.java @@ -16,18 +16,18 @@ public class MultiButt extends JFrame { BoxLayout layout = new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS); this.setLayout(layout); - this.label = new JLabel("Bouton 0"); + this.label = new JLabel(" "); label.setFont(new Font("SansSerif", Font.PLAIN, 25)); JPanel topPanel = new JPanel(); topPanel.add(label); this.add(topPanel); - ActionListener listener = new ReponseAuClic2(); + ActionListener listener = new ClicListener(); for (int i = 0;i < nbButtons; ++i){ JPanel tmp = new JPanel(); - JButton butt = new JButton("Bouton "+Integer.toString(i)); + JButton butt = new JButton("Bouton "+ i); butt.addActionListener(listener); tmp.add(butt); this.add(tmp); @@ -40,9 +40,9 @@ public class MultiButt extends JFrame { this.setVisible(true); } - private class ReponseAuClic2 implements ActionListener { + private class ClicListener implements ActionListener { - public ReponseAuClic2() { + public ClicListener() { } @Override -- libgit2 0.21.2