Commit 5d736557aa53f207d786bd98c560a0ffb5390ce1

Authored by shaggy42089
1 parent 0d83ec1e

tp2 done

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 }
src/tp2/ArdoiseMagique/Main.java 0 → 100644
@@ -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 +}
src/tp2/ArdoiseMagique/Main2.java 0 → 100644
@@ -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 -  
src/tp2/cr.md 0 → 100644
@@ -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