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