Académique Documents
Professionnel Documents
Culture Documents
CLASSES:
1) Il affiche d’abord “(0,0)” et après la méthode move, il affiche “(2,2)”.
2) L’erreur que l’on reçoit est la suivante : la classe ne se trouve pas dans un
fichier correspondant à son nom, elle devrait se trouver dans un fichier
“TestPoint.java”
3) Il ne se passe rien : sans modificateur, elle peut être utilisée uniquement à
l’intérieur du package.
MEMBRES:
1) On ne peut pas avoir accès à l’attribut x car il a comme visibilité “private”. “x
has private access in esi.atl.oo_base.Point”
2) Le programme affiche d’abord la méthode move(int,int) car lorsqu’on a utilisé
la méthode move, on a placé des int en paramètre. Cependant, lors de
l’affichage du point, la méthode toString fait directement référence aux
composantes qui sont de type double, d’où l’apparition des points. Il reste
cependant possible d'additionner des double et des int, la conversion étant
réalisée automatiquement.
3) Le compilateur ne voudra pas compiler la nouvelle méthode : il existe déjà
une méthode s’appelant “move” avec les même paramètres. La différence au
niveau du type de retour importe peu.
CONSTRUCTEUR:
Non, il n’y plus d’erreurs mais le compilateur attribue directement des valeurs
par défauts aux attributs (constructeur par défaut). Comme les attributs sont
des primitives double, il attribuera la valeur 0 pour les deux attributs.
ENCAPSULATION :
1)
2)
COPIE DÉFENSIVE:
2)
Quand le nouveau point p2 est créé, ce dernier l’est via la méthode getCenter
sur c, qui copie la référence du point au centre : quand nous modifions p2,
nous modifions en réalité l’objet référencé, c’est à dire le centre de l’objet c.
1) .
2)
3) L’invariant n’est plus respecté, le périmètre négatif en conteste (il est
négatif) : en ayant modifié directement le point bl, qu’on référence directement
dans le rectangle, on utilise la méthode move du point et pas celui du
rectangle. Ainsi, la vérification n’est pas exécutée et on a “indirectement”
modifié le rectangle.
4)
Héritage :
L’héritage est une technique qui permet à une classe, dite sous-classe ou classe
enfant de récupérer le type, les attributs et les méthodes d’une classe, dite super-
classe ou classe parent.
Questions :
Résumé :
Classe Object :
Questions :
1) Oui on peut car toute classe objet créée hérite forcément de la classe Object
de la bibliothèque java.lang
2) Oui car la classe ColoredPoint hérite la classe Point qui hérité elle même de
la classe Object. Et puis toute classe objet hérite de la classe Object.
3) Oui on peut ajouter cette instruction dans le main. Cette méthode est définie
dans la classe Object. On peut l’appeler sur un objet ColoredPoint pour les
mêmes raisons expliqué dans la question 2
Théorie :
Constructeur :
Questions :
1) le mot clé super lorsqu’un créé un constructeur d’une classe extends doit
toujours être le première instruction. C’est pour cela que nous avons une
erreur.
2) Le constructeur d’une classé hériter doit se souvenir des attributs hérités. Si il n’y a
pas de super, le compilateur ne pourra pas savoir où se trouve les attributs → ici c’est
double x et double y. super sert à aller chercher les attributs d’une classe hérité.
3) On a une erreur mais pas la même. (je ne comprend pas trop l’erreur donc je
passe)
Théorie :
Constructeur et héritage :
Exécution des constructeur :
Redéfinition de méthodes :
Questions :
Théorie :
Polymorphisme :
Dans cet exemple, la méthode printPoints reçoit une liste de Point. La boucle
assigne un à un les points de la liste à la variable p qui est de type Point.
Pour générer l’affichage, un appel (polymorphique) est fait aux méthodes move et
toString. Le code des méthodes move et toString réellement exécuté dépendra du
type de l’objet référencé. Il se trouvera dans la classe point, ou dans la classe
ColoredPoint ou encore dans la classe PinnablePoint selon le type de l’objet
référencé à ce moment-là
L’héritage et la rédéfinition sont des éléments essentiels de l’implémentation du
polymorphisme en Java.
Interface :
Les interfaces en java permettent de définir des contrats que les classes doivent
respecter. Ce contrat a la forme d’une liste de méthodes.
Questions :
1) On constate que placer le mot clé “protected” n’est pas permis pour les
méthodes dans une interface.
2) On constate qu’on peut placer le mot clé public devant les méthodes dans
une interface.
3) (à faire sur netbeans, là tu es juste sur un traitement de textes)
4) Il affiche tout d’abord le toString de la classe Point (“(1.0,1.0)”), ensuite le
toString de ColoredPoint (“(3.0, 5.0) - FF0000FF”) et enfin le toString de
PinnablePoint (“(2.0, 2.0) - not pinned”).
L’intérêt des interfaces est de les utiliser comme type de
variable/attribut/paramètre/retour (ex : l’interface List). Alliées au polymorphisme,
elles donnent plus de souplesse aux implémentations.
Classe abstraite :
Une classe doit être déclarée abstraite si toutes ses méthodes ne sont pas
implémentées. Notez également que, même si toutes les méthodes d’une classe
sont implémentées, une classe peut être déclarée abstraite. Suite dans la
documentation.
Polymorphisme :
Question 1 :
Question 2 :
1) B a2 = new A() ne compilera pas car un type B ne peut être converti en type
A.
2) toutes les instructions commençant par a2 ne compileront pas
3) a1.c et b1.c ne compileront pas car c’est une méthode qui provient de la
classe B.
4) ((B) a1).c() ne compilera pas car on ne peut pas convertir un type a à un type
B.
a de A
a de A
a de A
b de A
b de B
c de B
c de B
c de B
Théorie :
Mécanisme de sélection de méthode :
Lors de la définition d’une sous-classe, une méthode peut être héritée, redéfinie ou
surchargée. Le compilateur et, à l’exécution, la machine virtuelle jouent chacun un
rôle précis pour choisir la méthode qui sera exécutée. Cette section présente ce
mécanisme de sélection de méthode.
Questions :
Théorie :
Hello, world !
helloText.setFill(Color.RED);
La salle de spectacle
La description d'une application JavaFX suit l'analogie de la salle de spectacle :
import javafx.scene.text.Text
Questions
1) En modifiant les paramètres numériques du code d'instanciation de scène suivant
…
primaryStage.setTile"XXX";
primaryStage.initStyle(StageStyle.TRANSPARENT);
3) Afin de placer le composant Text au centre de l'écran, nous avons fait appel à la
méthode setCenter() de la classe BorderPane :
root.setCenter(helloText);
Cette zone correspond à celle évoquée précédemment. Il est ainsi tout à fait
possible d'utiliser les autres zones du layout :
● setTop() : le libellé est placé dans la zone supérieure du layout. Sans autres
précision, le libellé sera placé en haut à gauche.
● setBottom() : le libellé sera placé dans la zone inférieure du layout. Sans
autres précision, le libellé sera placé en bas à gauche.
● setLeft() : le libellé est placé dans la zone gauche du layout. Si la zone
supérieure est vide, cela donnera l'impression que le texte est en réalité dans
la zone supérieure. Si on venait à la remplir, alors le libellé viendrait se placer
juste en dessous de la zone supérieure, à gauche.
● setRight() : le libellé est placé dans la zone droite du layout. Si la zone
supérieure est vide, cela donnera l'impression que le texte est en réalité dans
la zone supérieure. Si on venait à la remplir, alors le libellé viendrait se placer
juste en dessous de la zone supérieure, à droite.
● setCenter() : le libellé est placé dans la zone centrale du layout et est
également aligné au centre.
Dans l'image à gauche, A remplit la zone supérieure. Dans celle de droite, la zone
supérieure est vide : les zones gauche et droite se placent accordement (il faut
imaginer la zone supérieure comme une crêpe très fine).
Labeled
De plus, il est possible d'accéder aux propriétés du label grâce à des getters, tel que
getText(), getFont() ou encore getTextFill().
Exercice
CheckBox
Ce composant est typiquement utilisé lorsque l'utilisateur peut choisir parmi
plusieurs options qui peuvent être simultanément activée. Le composant
CheckBox représente une case à cocher qui est caractérisée par trois états :
désélectionné, sélectionné et indéterminé. Chaque clic de l'utilisateur fera passer le
composant d'un état à un autre.
new CheckBox();
Ainsi :
BorderPane.setAlignment(checkBox1, Pos.CENTER);
BorderPane.setAlignment(checkBox3, Pos.CENTER);
… alors les cases 1 et 3 se placent de façon classique par rapport à la zone où elles
sont placées, c’est-à-dire gauche et droite. La méthode setAlignement() permet donc
d'aligner l'objet par rapport à la zone dans laquelle il se trouve (ici, centré
verticalement et horizontalement dans les zones gauche et droite).
TextInputControl
Terminé avec les labels, il est temps d'étudier les zones de texte. Comme on peut le
voir dans la figure suivante, la classe abstraite TextInputControl est la classe
parente de différents composants permettant à l'utilisateur de saisir du texte.
Cette classe définit les propriétés de base et les fonctionnalités communes aux
composants offrant une saisie de texte. Ces propriétés permettent la sélection et
l'édition de texte ou la gestion du curseur à l'intérieur du texte. On peut citer les
propriétés suivantes :
On indique qu'on place le label test dans la zone inférieure du layout, qu'on joue
avec les alignements, qu'on rend le champ de texte non éditable et que le nom entré
se trouve aligné au centre du champ.
TextArea
Le composant TextArea permet d'afficher et de saisir du texte dans un champ
multilignes (une zone de texte). Le texte peut être renvoyé à la ligne
automatiquement (wrapping) et des barres de défilement horizontales et/ou
verticales sont ajoutées automatiquement si la taille du composant ne permet pas
d'afficher l'entièreté du texte. Tous les caractères du texte possèdent les mêmes
attributs (police, style, taille, couleur, etc.).
Questions
Dans le code ci-dessous, nous avons ajouté l'utilisation d'un composant Button, qui
possède également la propriété onAction.
On a donc une zone de texte de 15 colonnes et 3 lignes, avec un retour à la ligne
automatique. Un bouton avec le libellé "Print" est également présent, avec comme
action quand il est pressé, d'afficher dans la console le texte inscrit dans la zone de
texte.
Les layouts
Jusqu'à présent, le positionnement des composants au sein d'un écran s'est fait en
utilisant les méthodes setCenter() ou setAlignement() d'un objet BorderPane. Celui-
ci fait partie de la famille des layouts. Ils permettent de définir la position au sein
d'une fenêtre des différents composants, les positions relatives de chaque
composant ainsi que les alignements et espacements de ceux-ci.
Le graphe de scène
BorderPane
Le conteneur BorderPane est divisé en cinq zones pouvant chacune contenir un
seul objet Node. Il est à noter que :
Questions
Le layout Vbox place quant à lui, les composants sur une ligne verticale de haut en
bas :
Il est également possible d'utiliser la méthode addAll() pour la liste des enfants. Il
suffit de spécifier les éléments dans l'ordre souhaité :
VBox does not clip its content by default, so it is possible that childrens’ bounds may
extend outside its own bounds if a child’s min size prevents it from being fit within
the vbox
Il est possible qu'un enfant sorte des limites si sa taille minimale l'empêche de
rentrer complètement dans la Vbox, qui ne redimensionne pas les éléments par
défaut. Il faudra faire attention à ce qu'ils ne sortent pas de la boîte, en indiquant par
exemple une taille minimale de fenêtre. Il est également possible de rajouter des
contraintes pour chaque enfant.
GridPane
Le conteneur GridPane permet de disposer les différents composants au sein d'une
grille. Elle peut être irrégulière, les dimensions de ses cases ne sont pas
nécessairement uniformes. La zone occupée par un composant peut s'étendre
(span) sur plusieurs lignes et/ou colonnes. Lors de la construction d'un GridPane, il
est inutile de spécifier les nombres de lignes et de colonnes attendus : ceux-ci sont
déterminés par les endroits où sont placés les composants.
De même, la taille des cases de la grille est déterminée par la taille des
composants les plus imposants au sein d'une ligne ou d'une colonne. La méthode
add() d'un GridPane prend en paramètres la position de chaque composant :
La méthode add() existe selon deux versions :
Questions
Si on place plusieurs composants dans une même cellule, ils se superposent
graphiquement.
On remarque à la page suivante que l'on créé d'abord une grille via GridPane. On y
place nos éléments de départ mais on aimerait bien rajouter quelques boutons tout
en bas. On utilise donc le layout HBox qui sera parfait pour créer ce panneau de
boutons.
On a donc un nœud racine qui est ici la grille, dans laquelle on place plusieurs
nœuds, que ce soit de simples composants ou carrément des layouts, avec ses
propres enfants.
Autres layouts disponibles
Au-delà des layouts présentés dans ce document, il en existe tout un tas d'autres :