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.