PROGRAMMATION ORIENTEE OBJET
Cours 2
Mohamed Nabil Saidi
msaidi@[Link]
1 Octobre 2018
Mohamed Nabil Saidi
AWT (Abstract Windowing Toolkit)
• Le AWT est subdivisé en trois groupes :
♦ graphiques : classes traitant des couleurs, polices,
images, curseurs, etc.
♦ composants : classes pour les GUI ; boutons, menus,
listes, boîtes de dialogues, etc.
♦ Layout-Manager : classes pour la configuration
(orgranisation) des composants graphiques dans les
conteneurs (comme les fenêtres)
• AWT contient aussi un package spécifique pour le
traitement des événements ([Link].*), le
traitement d’images, et le copier-coller
Mohamed Nabil Saidi
Conteneurs et composants (1)
• Une interface graphique en Java est un assemblage de
conteneurs (Container) et de composants (Component).
• Un composant est une partie "visible" de l'interface utilisateur
Java.
♦ C’est une sous-classes de la classe abstraite [Link].
♦ Exemple : les boutons, les zones de textes ou de dessin, etc.
• Un conteneur est un espace dans lequel on peut positionner
plusieurs composants.
♦ Sous-classe de la classe [Link]
♦ La classe Container est elle-même une sous-classe de la classe
Component
♦ Par exemple les fenêtres, les applets, etc.
Mohamed Nabil Saidi 3
Conteneurs et composants (2)
Object Hiérarchie d’héritage
(from la ng)
Button des principaux éléments des
interfaces graphiques en Java
Canvas Component
Checkbox
Container
Choice
Label
Panel Window
Scrollbar List
Dialog Frame
Applet
TextComponent
(from applet)
FileDialog
TextArea TextField
Mohamed Nabil Saidi 4
Conteneurs et composants (3)
• Les deux conteneurs les plus courants sont le Frame et le
Panel.
• Un Frame représente une fenêtre de haut niveau avec un
titre, une bordure et des angles de redimensionnement.
♦ La plupart des applications utilisent au moins un Frame
comme point de départ de leur interface graphique.
• Un Panel n'a pas une apparence propre et ne peut pas
être utilisé comme fenêtre autonome.
♦ Les Panels sont créés et ajoutés aux autres conteneurs de la
même façon que les composants tels que les boutons
♦ Les Panels peuvent ensuite redéfinir une présentation qui leur
soit propre pour contenir eux-mêmes d'autres composants.
Mohamed Nabil Saidi 5
Conteneurs et composants (4)
• On ajoute un composant dans un conteneur, avec la
méthode add() :
Panel p = new Panel();
Button b = new Button();
[Link](b);
• De manière similaire, un composant est retirer de son
conteneur par la méthode remove() :
[Link](b);
• Un composant a (notamment) :
♦ une taille préférée que l’on obtient avec getPreferredSize()
♦ une taille minimum que l’on obtient avec getMinimunSize()
♦ une taille maximum que l’on obtient avec getMaximunSize()
Mohamed Nabil Saidi 6
Conteneurs et composants (5)
import [Link].*;
public class EssaiFenetre1 Création d’une fenêtre
{ (un objet de la classe
public static void main(String[] args) Frame) avec un titre
{
Frame f =new Frame("Ma première fenêtre"); Création du bouton ayant
Button b= new Button("coucou"); pour label « coucou »
[Link](b);
[Link](); Ajout du bouton dans la
[Link](); fenêtre
}
} On demande à la fenêtre
de choisir la taille
minimum avec pack() et
de se rendre visible avec
show()
Mohamed Nabil Saidi 7
Conteneurs particuliers (1)
• Dialog
♦ Un objet Dialog ressemble à un objet Frame mais ne sert
qu'à afficher des messages (erreur, warnning, …) devant
être lus par l'utilisateur.
♦ Un objet Dialog dépend d'un objet Frame (ou héritant de
Frame)
Ø ce Frame est passé comme premier argument au constructeur.
♦ Un Dialog n'est pas visible lors de sa création. Utiliser la
méthode show() pour la rendre visible (il existe une
méthode hide() pour la cacher).
Mohamed Nabil Saidi 8
Conteneurs particuliers (2)
• FileDialog
♦ C’est une sous-classe de Dialog ; par défaut elle n’est pas
visible.
♦ C'est un dispositif de sélection de fichier : on peut préciser
si c’est en vue d’une sauvegarde ou du chargement d’un
fichier
♦ Un FileDialog ne gère généralement pas d'événements.
♦ Comme pour un objet Dialog, un FileDialog dépend d’un
objet Frame
♦ Un FileDialog est une fenêtre modale : à partir du moment
ou la fenêtre a été rendue visible par la méthode show(...),
la main n’est rendu à l’utilisateur que quand un fichier a
été sélectionné.
Mohamed Nabil Saidi 9
Conteneurs particuliers (3)
• FileDialog
Mohamed Nabil Saidi 10
Conteneurs particuliers (4)
• ScrollPane
♦ C'est un conteneur général de type Panel
Ø tout comme un Panel il ne peut pas être utilisé de façon
indépendante
Ø il fournit des barres de défilement (scrollbars) verticales et/ou
horizontales
♦ Un ScrollPane ne peut contenir qu'un seul composant
♦ Ce conteneur n’est pas très intéressant mais est cité pour
information.
Mohamed Nabil Saidi 11
Gestionnaire de présentation (1)
• A chaque conteneur est associé un gestionnaire de
présentation (layout manager)
• Le gestionnaire de présentation gère le positionnement et
le (re)dimensionnement des composants d’un conteneur.
• Le ré-agencement des composants dans un conteneur a
lieu lors de :
♦ la modification de sa taille,
♦ le changement de la taille ou le déplacement d'un des composants.
♦ l'ajout, l'affichage, la suppression ou le masquage d'un composant.
• Les principaux gestionnaires de présentation de l'AWT
sont : FlowLayout, BorderLayout, GridLayout,
CardLayout, GridBagLayout
Mohamed Nabil Saidi 22
Gestionnaire de présentation (2)
• Tout conteneur possède un gestionnaire de présentation
par défaut.
♦ Tout instance de Container référence une instance de
LayoutManager.
♦ Il est possible d'en changer grâce à la méthode setLayout().
• Les gestionnaires de présentation par défaut sont :
♦ Le BorderLayout pour Window et ses descendants (Frame,
Dialog, …)
♦ Le FlowLayout pour Panel et ses descendants (Applet, etc.)
Mohamed Nabil Saidi 23
FlowLayout (1)
• Le FlowLayout est le plus simple des managers de
l'AWT
• Gestionnaire de présentation utilisé par défaut dans
les Panel si aucun LayoutManager n'est spécifié.
• Un FlowLayout peut spécifier :
♦ une justification à gauche, à droite ou centrée,
♦ un espacement horizontal ou vertical entre deux
composants.
♦ Par défaut, les composants sont centrés à l'intérieur de la
zone qui leur est allouée.
Mohamed Nabil Saidi 24
FlowLayout (2)
• La stratégie de disposition du FlowLayout est la
suivante :
♦ Respecter la taille préférée de tous les composants
contenus.
♦ Disposer autant de composants que l'on peut en faire tenir
horizontalement à l'intérieur de l'objet Container.
♦ Commencer une nouvelle rangée de composants si on ne
peut pas les faire tenir sur une seule rangée.
♦ Si tous les composants ne peuvent pas tenir dans l'objet
Container, ce n'est pas géré (c'est-à-dire que les
composants peuvent ne pas apparaître).
Mohamed Nabil Saidi 25
FlowLayout (3)
OK Ouvrir Redimensionnement Ouvrir Fermer
OK
Fermer
plus visible
OK Ouvrir Redimensionnement
OK Ouvrir Fermer
Fermer
Mohamed Nabil Saidi 26
FlowLayout (4)
Redimensionnement
Redimensionnement
Mohamed Nabil Saidi 27
FlowLayout (5)
Redimensionnement
Redimensionnement
Mohamed Nabil Saidi 28
FlowLayout (6)
• Le FlowLayout cache réellement et effectivement les
composants qui ne rentrent pas dans le cadre.
• Le FlowLayout n'a d'intérêt que quand il y a peu de
composants.
• L'équivalent vertical du FlowLayout n'existe pas
• La présentation FlowLayout positionne les composants
ligne par ligne.
♦ Chaque fois qu'une ligne est remplie, une nouvelle ligne est
commencée.
• Le gestionnaire FlowLayout n'impose pas la taille des
composants mais leur permet d'avoir la taille qu'ils
préfèrent.
Mohamed Nabil Saidi 29
BorderLayout (1)
• BorderLayout divise son espace de travail en cinq
zones géographiques : North, South, East, West et
Center.
• Les composants sont ajoutés par nom à ces zones (un
seul composant par zone).
♦ Exemple
add("North", new Button("Le bouton nord !"));
♦ Si une des zones de bordure ne contient rien, sa taille est 0.
Mohamed Nabil Saidi 30
BorderLayout (2)
• Division de l’espace avec le BorderLayout
NORTH
WEST CENTER EAST
SOUTH
Mohamed Nabil Saidi 31
BorderLayout (3)
import [Link].*;
import [Link].*;
public class EssaiBorderLayout extends JFrame
{
private JButton b1,b2,b3,b4, b5;
public EssaiBorderLayout() {
setLayout(new BorderLayout());
b1 = new JButton ("Nord"); b2 = new JButton ("Sud");
b3 = new JButton ("Est"); b4 = new JButton ("Ouest");
b5 = new JButton ("Centre");
[Link](b1, [Link]);
[Link](b2 , [Link]);
[Link](b3, [Link]);
[Link](b4, [Link]);
[Link](b5, [Link]);
}
public static void main (String args []) {
EssaiBorderLayout essai = new EssaiBorderLayout();
[Link] ();
[Link](true) ;
}}
Mohamed Nabil Saidi 32
BorderLayout (4)
• Stratégie de disposition du BorderLayout
♦ S'il y a un composant dans la partie placée dans la partie NORTH, il
récupère sa taille préférée, respecte sa hauteur préférée si possible et fixe sa
largeur à la totalité de la largeur disponible de l'objet Container.
♦ S'il y a un composant dans la partie placée dans la partie SOUTH, il fait
pareil que dans le cas de la partie NORTH.
♦ S'il y a un composant dans la partie placée dans la partie EAST, il récupère
sa taille préférée, respecte sa largeur préférée si possible et fixe sa hauteur
à la totalité de la hauteur encore disponible.
♦ S'il y a un composant dans la partie placée dans la partie WEST, il fait
pareil que dans le cas de la partie EAST.
♦ S'il y a un composant dans la partie CENTER, il lui donne la place qui
reste, s'il en reste encore.
Mohamed Nabil Saidi 33
BorderLayout (6)
• Lors du redimensionnement, le composant est lui-
même redimensionné en fonction de la taille de la
zone, c-à-d :
♦ les zones nord et sud sont éventuellement élargies mais
pas allongées.
♦ les zones est et ouest sont éventuellement allongées mais
pas élargies,
♦ la zone centrale est étirée dans les deux sens.
Mohamed Nabil Saidi 34
BorderLayout (7)
N N
Redimensionnement
O C E
O C E
S
Mohamed Nabil Saidi 35
BorderLayout (8)
Redimensionnement
Redimensionnement
Mohamed Nabil Saidi 36
GridLayout (1)
• Le GridLayout dispose les composants dans une
grille.
♦ Découpage de la zone d'affichage en lignes et en colonnes
qui définissent des cellules de dimensions égales.
♦ Chaque composant à la même taille
Ø quand ils sont ajoutés dans les cellules le remplissage s ’effectue
de gauche à droite et de haut en bas.
♦ Les 2 paramètres sont les rangées et les colonnes.
♦ Construction d'un GridLayout : new GridLayout(3,2);
nombre de lignes nombre de colonnes
Mohamed Nabil Saidi 37
GridLayout (3)
import [Link].*;
import [Link].*;
class AppliGridLayout extends JFrame
{
public AppliGridLayout()
{
super("AppliGridLayout");
[Link](new GridLayout(3,2));
for (int i = 1; i < 7; i++)
add(new JButton([Link](i)));
[Link]();
[Link]();
}
public static void main(String args[])
{
AppliGridLayout appli = new AppliGridLayout();
}}
Mohamed Nabil Saidi 38
GridLayout (4)
• Lors d’un redimensionnement les composants
changent tous de taille mais leurs positions relatives
ne changent pas.
1 2 1 2
Redimensionnement
3 4 4
3
5 6
5 6
Mohamed Nabil Saidi 39
GridLayout (5)
Redimensionnement
Mohamed Nabil Saidi 40
CardLayout
• Le CardLayout n'affiche qu'un composant à la fois :
♦ les composants sont considérées comme empilées, à la façon
d'un tas de cartes.
• La présentation CardLayout permet à plusieurs
composants de partager le même espace d'affichage de
telle sorte que seul l'un d'entre eux soit visible à la fois.
• Pour ajouter un composant à un conteneur utilisant un
CardLayout il faut utiliser add(String cle, Component
monComposant)
• Permet de passer de l ’affichage d ’un composant à un
autre en appelant les méthodes first, last, next, previous ou
show
Mohamed Nabil Saidi 41
GridBagLayout
• Le gestionnaire GridBagLayout fournit des fonctions
de présentation complexes
♦ basées sur une grille dont les lignes et les colonnes sont de
taille variables.
♦ permet à des composants simples de prendre leur taille
préférée au sein d'une cellule, au lieu de remplir toute la
cellule.
♦ permet aussi l'extension d'un même composant sur
plusieurs cellules.
• Le GridBagLayout est compliqué à gérer.
♦ Dans la plupart des cas, il est possible d’éviter de
l’utiliser en associant des objets Container utilisant des
gestionnaires différents.
Mohamed Nabil Saidi 42
Mise en forme complexe
super("AppliComplexeLayout");
setLayout(new BorderLayout());
JPanel pnorth = new JPanel();
[Link](b1); [Link](b2);
[Link](b3); [Link](b4);
[Link](pnorth,[Link]);
JPanel pcenter = new JPanel();
[Link](new GridLayout(2,2));
[Link](gr1); [Link](gr2);
[Link](gr3); [Link](gr4);
[Link](pcenter,[Link]);
JPanel psouth = new JPanel();
[Link](new FlowLayout());
[Link](ch); [Link](tf);
[Link](psouth, [Link]);
Mohamed Nabil Saidi 43
D’autres gestionnaires?
• On peut imposer à un objet « container » de n’avoir
pas de gestionnaire en fixant son LayoutManager à la
valeur null
♦ Frame f = new Frame(); [Link](null);
♦ A la charge alors du programmeur de positionner chacun
des composants « manuellement » en indiquant leur
position absolue dans le repère de la fenêtre.
♦ C’est à éviter, sauf dans des cas particuliers,.
• Il est possible d’écrire ses propres LayoutManager…
Mohamed Nabil Saidi 44
Récapitulatif
• FlowLayout
♦ Flux : composants placés les uns derrière les autres
• BorderLayout
♦ Ecran découpé en 5 zones (« North », « West », « South »,
« East », « Center »)
• GridLayout
♦ Grille : une case par composant, chaque case de la même
taille
• CardLayout
♦ « Onglets » : on affiche un élément à la fois
• GridBagLayout
♦ Grille complexe : plusieurs cases par composant
Mohamed Nabil Saidi 45
Swing
• A cause des problèmes de portabilité, le développement de
l AWT a été interrompu. Il a été étendu par le JFC (Java
Foundation Class).
• Les éléments graphiques ont été regroupés dans le package
Swing
• La bibliothèque Swing est une nouvelle bibliothèque de
composants graphiques pour Java.
♦ Swing est intégré à Java 1.2.
♦ Swing peut être téléchargé séparément pour une utilisation avec des
versions de Java antérieures (1.1.5+)
• Les anciens navigateurs ne connaissent pas les Swing
• Les AWT sont plus rapides et plus faciles à utiliser
Mohamed Nabil Saidi 12
Composants graphiques lourds (1)
• Un composant graphique lourd (heavyweight GUI
component) s'appuie sur le gestionnaire de fenêtres
local, celui de la machine sur laquelle le programme
s'exécute.
Ø awt ne comporte que des composants lourds.
Ø Ce choix technique a été initialement fait pour assurer la
portabilité.
Mohamed Nabil Saidi 13
Composants graphiques lourds (2)
• Exemple :
♦ Un bouton de type [Link] intégré dans une
application Java sur la plate-forme Unix est représenté
grâce à un vrai bouton Motif (appelé son pair - peer en
anglais).
♦ Java communique avec ce bouton Motif en utilisant la
Java Native Interface. Cette communication induit un coût.
♦ C'est pourquoi ce bouton est appelé composant lourd.
Mohamed Nabil Saidi 14
Composants légers de Swing
• Un composant graphique léger (en anglais, lightweight
GUI component) est un composant graphique
indépendant du gestionnaire de fenêtre local.
♦ Un composant léger ressemble à un composant du
gestionnaire de fenêtre local mais n'en est pas un : un
composant léger émule les composants de gestionnaire de
fenêtre local.
♦ Un bouton léger est un rectangle dessiné sur une zone de
dessin qui contient une étiquette et réagit aux événements
souris.
♦ Tous les composants de Swing, exceptés JApplet, JDialog,
JFrame et JWindow sont des composants légers.
Mohamed Nabil Saidi 15
Atouts de Swing
• Plus de composants, offrant plus de possibilités.
• Les composants Swing dépendent moins de la plate-
forme :
♦ Il est plus facile d'écrire une application qui satisfasse au
slogan "Write once, run everywhere"
♦ Swing peut pallier aux faiblesses (bug?) de chaque
gestionnaire de fenêtre.
Mohamed Nabil Saidi 16
Conventions de nommage
• Les composants Swing sont situés dans le paquetage
[Link] et ses sous paquetages.
♦ Un certain nombre de paquetages d'extensions du langage
java 1.1 (par opposition aux paquetages standards java)
sont regroupés sous javax.
• Ils portent des noms similaires à leurs correspondants
de AWT précédés d'un J.
♦ JFrame, JPanel, JTextField, JButton, JCheckBox, JLabel,
etc.
Mohamed Nabil Saidi 17
AWT # Swing
AWT SWING
"Composants lourds "Composants légers (La plupart)
"L'exécution est indépendante de la plate-
"L’implantation et l'exécution dépend de la
forme.
plate-forme (du système).
"Composants écrits en Java (Portabilité
"Tout composant est associé à un élément
totale).
(peer) dépendant du système "Permet les PLAF (Pluggable Look And
"Repose sur du code non documenté : celui Feel ) : changer au moment de l’exécution
du système d’exploitation le “Look & Feel” de l’interface
"Offre plus de possibilités
"Peut être transparente ou non
Mohamed Nabil Saidi 18
Aperçu des composants Swing (1)
Mohamed Nabil Saidi 19
Aperçu des composants Swing (2)
Mohamed Nabil Saidi 20
Aperçu des composants Swing (3)
Mohamed Nabil Saidi 21
JFrame (1)
[Link]
|
+--[Link]
|
+--[Link]
|
+--[Link]
• Le JFrame
♦ Un objet JFrame a un comportement par défaut associé à une
tentative de fermeture de la fenêtre.
Ø Contrairement à la classe Frame, qui ne réagissait pas par défaut,
l'action de fermeture sur un JFrame rend par défaut la fenêtre invisible.
Ø Ce comportement par défaut peut être modifié par
setDefaultCloseOperation().
Mohamed Nabil Saidi 46
JFrame (2)
• 4 comportements sont possibles lors de la fermeture de la fenètre
• DO_NOTHING_ON_CLOSE
• HIDE_ON_CLOSE
• DISPOSE_ON_CLOSE
• EXIT_ON_CLOSE
import [Link].*;
public class Simple {
public static void main(String[] args) {
JFrame cadre = new JFrame("Ma fenetre");
[Link](JFrame.EXIT_ON_CLOSE);
[Link](300, 200);
[Link](true);
}
} détermine que l’application sera terminée
Lorsqu’on fermera la fenêtre
Mohamed Nabil Saidi 47
JFrame (3)
♦Par rapport a Frame, le conteneur d'un JFrame n'est plus confondu avec le
cadre lui-même.
ØIl possède une couche de contenu, dans laquelle on peut ajouter les composants
graphiques et dont on peut changer le gestionnaire de présentation.
ØCette couche est obtenue par la méthode getContentPane();
Avec AWT
Frame monFrame = new Frame ("Mon Frame");
Button monBouton = new Button ("Mon Bouton");
[Link](monBouton);
Avec Swing
JFrame monFrame = new JFrame ("Mon Frame");
JButton monBouton = new JButton ("Mon Bouton");
Container panneauContenu = [Link]();
[Link](monBouton);
Mohamed Nabil Saidi 48
JFrame (4)
• La méthode setSize(largeur, hauteur) détermine la
taille de la fenêtre en pixels
• Idem pour setBounds(x, y, largeur, hauteur)
• pack() : elle calcule la taille nécessaire de la fenêtre,
en fonction des composants contenus et du
gestionnaire de répartition considéré
• setVisible(b) ou show() : rendre la fenêtre
effectivement visible (ou invisible)
Mohamed Nabil Saidi
JLabel
Méthodes
" public void setVisible(boolean b)
" public void setEnabled( boolean b )
" public void setSize(int w,int h)
" public void setToolTipText(String s)
" public void setBorder(Border b)
" public void setText(String s)
" public void setHorizontalTextPosition(int textposition)
" Public void setIcon(Icon image)
Icon monIcone = new ImageIcon("[Link]");
// Un JLabel
JLabel monLabel = new JLabel("Mon Label");
[Link](monIcone);
[Link]([Link]);
// Un JButton
JButton monBouton = new JButton("Mon bouton", monIcone);
Mohamed Nabil Saidi 50