TD/TP 5
Ce sujet est inspiré d’un examen à l’IUT d’Aix-Marseille Université en 2021. Il a été adapté par l’équipe pédagogique de l’IUT de Montpellier (petru.valicov@umontpellier.fr).
Exercice 17 - Un peu d’arithmétique
On s’intéresse à un petit programme qui permet d’afficher des problèmes arithmétiques et qui affiche combien de réponses sont justes. Voici une présentation de l’application en deux étapes.
Étape 1 :

Étape 2 :

Le contrôle que vous aurez à utiliser est un ComboBox, qui permet de choisir le nombre d’exercices à afficher. Veuillez regarder la documentation de cette classe pour savoir comment l’utiliser avant de poursuivre.
Notamment, observez l’utilisation de la propriété valueProperty et selectedItemProperty, qui permet de savoir quelle est la valeur actuelle de la ComboBox. Quand un item est sélectionné, la propriété est mise à jour pour représenter l’item sélectionné.
- Complétez la méthode
start()de la classeAppMathset créez une fenêtre rassemblant à celle de l’étape 1 pour que laComboBoxaffiche 6, 9, 12 et 15 comme choix possibles. - Complétez la classe
LigneExerciceafin qu’elle modélise chacune des lignes d’exercices (image de l’étape 2). Notez que parmi les attributs de cette classe, il y a un objet de typeExercice. - Modifiez le code de la classe
AppMathsafin de prendre en compte le choix de l’utilisateur et mettre à jour la fenêtre de façon à ce qu’elle ressemble à celle de l’étape 2. Pour mettre à jour dynamiquement les exercices affichés en fonction du choix de l’utilisateur, on vous propose de suivre le processus suivant :- Ajouter un
ChangeListenersurvaluePropertyde votreComboBoxafin que la méthodechanged()de cet écouteur fasse le changement nécessaire - Dans la méthode
changed(), vous devrez :- créer le nombre nécessaire de lignes d’exercices et les ajouter dans un conteneur
VBox(pensez à nettoyer au préalable les exercices qui seraient déjà dans la liste…). - ajouter dans le même conteneur un bouton de validation des résultats qui, pour moment, ne fera rien.
- pensez à ajuster la taille de la fenêtre pour que tous les éléments de votre conteneur contenant les exercices soient visibles. Vous pouvez utiliser l’instruction suivante :
votreContaineur.getScene().getWindow().sizeToScene();
- créer le nombre nécessaire de lignes d’exercices et les ajouter dans un conteneur
- Ajouter un
-
La classe
Exercicevous est partiellement donnée. Elle génère un exercice avec son énoncé et sa solution. Ajoutez à cette classe une propriétéIntegerProperty solutionqui encapsulera la solution à l’énoncé. Ajoutez un getter sur cette propriété. -
Ajoutez une propriété
BooleanProperty correctà la classeLigneExercice. Cette propriété devra permettre de savoir si la réponse fournie est correcte (c’est-à-dire correspond à la solution de l’exercice). -
Ajoutez dans la classe principale
AppMathsun gestionnaire d’événement sur le bouton de validation. Il devra afficher une nouvelle fenêtre indiquant le nombre de réponses correctes. Pour cela, vous utiliserez la classe Alert de JavaFX. La fonctionshowAndWait()vous permettra de rendre la fenêtre bloquante : tant que l’utilisateur n’a pas validé, il ne pourra pas revenir sur la fenêtre principale. - Dans votre version actuelle, lorsqu’un utilisateur choisit un nombre d’exercices, l’intégralité de la liste des exercices est régénérée. Modifiez le code de façon à ce qu’un maximum des exercices incorrectement répondus soit régénéré d’abord avant de générer les nouveaux (si le nombre d’exercices incorrects est supérieur au choix
nde laComboBox, on affichera lesnpremiers exercices incorrects).
Exercice 18 - Un peu de géométrie
On s’intéresse à un petit programme qui permet de dessiner des rectangles et qui devra rassembler à l’image ci-dessous.

Cette application dessine un rectangle dans le panneau de couleur de fond bleu cyan et affiche le périmètre de ce rectangle dans le composant TextField correspondant.
Le rectangle est défini par 2 points A et B, sommets opposés, donc symétriques par rapport au centre.
Les 2 Sliders permettent de renseigner les valeurs des coordonnées du point A.
Les boutons
et
permettent de modifier les valeurs des coordonnées du point B, coordonnées qui s’afficheront aussi dans le TextField (ici non éditable) figurant entre les deux boutons (non éditable).
La classe principale est RectanglePerimeterCalculatorAndDrawer. Elle vous est intégralement donnée. À priori, vous n’aurez pas à la modifier.
- Utilisez l’outil SceneBuilder pour compléter le fichier
fenetrePerimetre.fxmlpour que l’application ressemble à l’image ci-dessus. La fenêtre correspond à une grille et le panneau coloré du bas est déjà donné sous forme de conteneurPane. Les lignes du rectangle ne doivent pas encore être dessinées. - Définissez dans la classe
Rectanglequatre attributsIntegerPropertyxA,yA,xB,yB, ainsi qu’une propriétéperimetreet instanciez-les dans le constructeur. Ajoutez un getter sur chacune de ces propriétés (mais pas de setter sur la valeur). - Écrivez le code de la méthode
createBinding()qui doit :- gérer le calcul de la largeur du rectangle
- gérer le calcul de la hauteur du rectangle
- définir la liaison du périmètre avec les calculs des largeur et hauteur précédemment définis.
La classe PanneauPrincipal représente le contrôleur pour le fichier FXML fenetrePerimetre.fxml et son code est à compléter dans les questions qui vont suivre.
-
Ajoutez quatre attributs de type
Linequi correspondront aux côtés du rectangle à dessiner et complétez la méthodeaddLines()pour ajouter les 4 segments au panneau bleu du bas de la fenêtre. -
Écrivez les méthodes
incrementerBx()etdecrementerBx(): il s’agit de modifier la valeur desTextFieldcorrespondants du fichier FXML en tenant des contraintes suivantes : on ne peut pas décrémenter en dessous de 0, ni incrémenter au-dessus devaleurMaxCoordonnees. Mettez à jour le fichier FXML pour que le clic sur les boutons
et
invoque ces fonctions. -
Pour gérer le clic sur les boutons agissant sur l’ordonnée du second point, complétez le contenu des méthodes
setByMinusAction()etsetByPlusAction(). -
Complétez la méthode
bindSommetsRectangle(): elle devra lier les coordonnées des 2 points A et B de l’attributrectangleaux contrôles correspondants (les Sliders pour un point et les Buttons pour l’autre). -
Dans la méthode
bindPerimeterTextField(), liez la propriété text duTextFieldreprésentant la valeur du périmètre à la propriété correspondante dans la classeRectangle. -
Implémentez les méthodes
bindHorizontal1()etbindVertical1(), qui adaptent le tracé de (seulement) 2 segments du rectangle dont une extrémité correspond au point A : liez, pour le segment concerné, les propriétés correspondant aux coordonnées de son point de départ (startXetstartY) et de son point d’arrivée (endXetendY) aux coordonnées correspondantes dans le rectangle. Pour que les segments soient correctement dessinés sur lePanecorrespondant de la fenêtre, il faudra appliquer un facteur multiplicatif égal àratioDessin.