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 46 oldx = x;
47 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 49 pixelArray[x][y] = color;
51 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 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 @@
  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 @@
  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   -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 @@
  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 48  
49 49 private class ReponseAuClic implements ActionListener {
50 50  
51   - public ReponseAuClic() {
52   - }
  51 + public ReponseAuClic() {}
53 52  
54 53 @Override
55 54 public void actionPerformed(ActionEvent e) {
... ...
src/tp2/getSource/MultiButt.java
... ... @@ -16,18 +16,18 @@ public class MultiButt extends JFrame {
16 16 BoxLayout layout = new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS);
17 17 this.setLayout(layout);
18 18  
19   - this.label = new JLabel("Bouton 0");
  19 + this.label = new JLabel(" ");
20 20 label.setFont(new Font("SansSerif", Font.PLAIN, 25));
21 21  
22 22 JPanel topPanel = new JPanel();
23 23 topPanel.add(label);
24 24 this.add(topPanel);
25 25  
26   - ActionListener listener = new ReponseAuClic2();
  26 + ActionListener listener = new ClicListener();
27 27  
28 28 for (int i = 0;i < nbButtons; ++i){
29 29 JPanel tmp = new JPanel();
30   - JButton butt = new JButton("Bouton "+Integer.toString(i));
  30 + JButton butt = new JButton("Bouton "+ i);
31 31 butt.addActionListener(listener);
32 32 tmp.add(butt);
33 33 this.add(tmp);
... ... @@ -40,9 +40,9 @@ public class MultiButt extends JFrame {
40 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 48 @Override
... ...