Académique Documents
Professionnel Documents
Culture Documents
Sixime partie
Pr Hafidi Imad
1 Hafidi Imad -ENSA de Khouribga-Cours JAVA
imad.hafidi@gmail.com
Conteneurs et composants 1!
Une interface graphique en Ja a est un assemb!age conteneurs "Container# et de composants "Component#$ Un composant est une partie % isib!e% de !&interface uti!isateur Ja a$
C'est une sous-c!asses de !a c!asse abstraite java.awt.Component$ E)emp!e * !es boutons+ !es ,ones de te)tes ou de dessin+ etc$
Conteneurs et composants 2!
Object
(from la ng)
Button
Canvas
Component
Label
Panel List
W indow
Scrollbar
Frame
TextArea
TextField
FileDialog
-es deu) conteneurs !es p!us courants sont !e Frame et !e Panel$ Un Frame repr1sente une fen.tre de haut ni eau a ec un titre+ une bordure et des ang!es de redimensionnement$
-a p!upart des app!ications uti!isent au moins un Frame comme point de d1part de !eur interface graphique$
Un Panel n&a pas une apparence propre et ne peut pas .tre uti!is1 comme fen.tre autonome$
-es Panels sont cr11s et a3out1s au) autres conteneurs de !a m.me fa4on que !es composants te!s que !es boutons -es Panels peu ent ensuite red1finir une pr1sentation qui !eur soit propre pour contenir eu)-m.mes d&autres composants$
Conteneurs et composants #!
5n a3oute un composant dans un conteneur+ a ec !a m1thode add"#
Panel p = new Panel(); Button b = new Button(); p.add(b);
6e mani7re simi!aire+ un composant est retirer de son conteneur par !a m1thode remo e"# *
p.remove(b);
Un composant a "notamment# *
une tai!!e pr1f1r1e que !'on obtient a ec getPreferredSize() une tai!!e minimum que !'on obtient a ec getMinimunSize() une tai!!e ma)imum que !'on obtient a ec getMaximunSize()
Conteneurs et composants $!
import java.awt.*; public class EssaiFenetre1 { public static void main(String[] args) { Frame f =new Frame("Ma premire fentre"); Button b= new Button("coucou"); f.add(b); f.pack(); f.show(); } } Cration dune fentre (un objet de la classe Frame) avec un titre Cration du bouton ayant pour label coucou Ajout du bouton dans la fentre On demande la fentre de choisir la taille minimum avec pack() et de se rendre visible avec show()
Hafidi Imad -ENSA de KhouribgaCours JAVA
%estionnaire de prsentation 1!
A chaque conteneur est associ1 un gestionnaire de pr1sentation "layout manager# -e gestionnaire de pr1sentation g7re !e positionnement et !e "re#dimensionnement des composants d'un conteneur$ -e r1-agencement des composants dans un conteneur a !ieu !ors de *
!a modification de sa tai!!e+ !e changement de !a tai!!e ou !e d1p!acement d&un des composants$ !&a3out+ !&affichage+ !a suppression ou !e masquage d&un composant$
-es principau) gestionnaires de pr1sentation de !&A;< sont * FlowLayout, BorderLayout, GridLayout, CardLayout, GridBagLayout
%estionnaire de prsentation 2!
<out conteneur poss7de un gestionnaire de pr1sentation par d1faut$
<out instance de Container r1f1rence une instance de LayoutManager$ I! est possib!e d&en changer gr=ce > !a m1thode setLayout()$
Une fois insta!!1+ un gestionnaire de pr1sentation fonctionne %tout seu!% en interagissant a ec !e conteneur$
&low'a(out 1!
-e A!oB-aCout est !e p!us simp!e des managers de !&A;< Destionnaire de pr1sentation uti!is1 par d1faut dans !es Panel si aucun LayoutManager n&est sp1cifi1$ Un FlowLayout peut sp1cifier *
une 3ustification > gauche+ > droite ou centr1e+ un espacement hori,onta! ou ertica! entre deu) composants$ /ar d1faut+ !es composants sont centr1s > !&int1rieur de !a ,one qui !eur est a!!ou1e$
EF
&low'a(out 2!
-a strat1gie de disposition du FlowLayout est !a sui ante *
Gespecter !a taille prfre de tous !es composants contenus$ 6isposer autant de composants que !&on peut en faire tenir hori,onta!ement > !&int1rieur de !&ob3et Container$ Commencer une nou e!!e rang1e de composants si on ne peut pas !es faire tenir sur une seu!e rang1e$ Si tous !es composants ne peu ent pas tenir dans !&ob3et Container+ ce n&est pas g1r1 "c&est->-dire que !es composants peu ent ne pas apparaHtre#$
EE
&low'a(out "!
OK Ouvrir Redimensionnement OK Ouvrir Fermer
Fermer
plus visible
OK
Ouvrir
Redimensionnement
OK
Ouvrir
Fermer
Fermer
EI
&low'a(out )!
Redimensionnement
Redimensionnement
E(
&low'a(out #!
Redimensionnement
Redimensionnement
E0
&low'a(out $!
-e FlowLayout cache r1e!!ement et effecti ement !es composants qui ne rentrent pas dans !e cadre$ -e FlowLayout n&a d&int1r.t que quand i! C a peu de composants$ -&1qui a!ent ertica! du FlowLayout n&e)iste pas -a pr1sentation FlowLayout positionne !es composants !igne par !igne$
Chaque fois qu&une !igne est remp!ie+ une nou e!!e !igne est commenc1e$
-e gestionnaire FlowLayout n&impose pas !a tai!!e des composants mais !eur permet d&a oir !a tai!!e qu&i!s pr1f7rent$
E2
*order'a(out 1!
BorderLayout di ise son espace de tra ai! en cinq ,ones g1ographiques * North+ South+ East+ West et Center$ -es composants sont a3out1s par nom > ces ,ones "un seu! composant par ,one#$
E)emp!e add("North", new Button("Le bouton nord !")); Si une des ,ones de bordure ne contient rien+ sa tai!!e est F$
E8
*order'a(out 2!
6i ision de !'espace a ec !e Jorder-aCout
NORTH
WEST
CENTER
EAST
SOUTH
E9
*order'a(out "!
import java.awt.*; public class EssaiBorderLayout extends Frame { private Button b1,b2,b3,b4, b5; public EssaiBorderLayout() { setLayout(new BorderLayout()); b1 = new Button ("Nord"); b2 = new Button ("Sud"); b3 = new Button ("Est"); b4 = new Button ("Ouest"); b5 = new Button ("Centre"); this.add(b1, BorderLayout.NORTH); this.add(b2 , BorderLayout.SOUTH); this.add(b3, BorderLayout.EAST); this.add(b4, BorderLayout.WEST); this.add(b5, BorderLayout.CENTER); } public static void main (String args []) { EssaiBorderLayout essai = new EssaiBorderLayout(); essai.pack (); essai.setVisible(true) ; }}
E: Hafidi Imad -ENSA de KhouribgaCours JAVA
*order'a(out )!
Strat1gie de disposition du BorderLayout
S&i! C a un composant dans !a partie p!ac1e dans !a partie NORTH+ i! r1cup7re sa taille prfre+ respecte sa hauteur prfre si possib!e et fi)e sa !argeur > !a tota!it1 de !a !argeur disponib!e de !&ob3et Container$ S&i! C a un composant dans !a partie p!ac1e dans !a partie SOUTH+ i! fait parei! que dans !e cas de !a partie NORTH$ S&i! C a un composant dans !a partie p!ac1e dans !a partie EAST+ i! r1cup7re sa taille prfre+ respecte sa largeur prfre si possib!e et fi)e sa hauteur > !a tota!it1 de !a hauteur encore disponib!e$ S&i! C a un composant dans !a partie p!ac1e dans !a partie EST+ i! fait parei! que dans !e cas de !a partie EAST$ S&i! C a un composant dans !a partie !ENTER+ i! !ui donne !a p!ace qui reste+ s&i! en reste encore$
E?
*order'a(out #!
-ors du redimensionnement+ !e composant est !ui-m.me redimensionn1 en fonction de !a tai!!e de !a ,one+ c->-d *
!es ,ones nord et sud sont 1 entue!!ement 1!argies mais pas a!!ong1es$ !es ,ones est et ouest sont 1 entue!!ement a!!ong1es mais pas 1!argies+ !a ,one centra!e est 1tir1e dans !es deu) sens$
IF
*order'a(out +!
N Redimensionnement O C S E O
IE
*order'a(out ,!
Redimensionnement
Redimensionnement
II
%rid'a(out 1!
-e GridLayout dispose !es composants dans une gri!!e$
61coupage de !a ,one d&affichage en !ignes et en co!onnes qui d1finissent des ce!!u!es de dimensions 1ga!es$ Chaque composant > !a m.me tai!!e
quand i!s sont a3out1s dans !es ce!!u!es !e remp!issage s 'effectue de gauche > droite et de haut en bas$
-es I param7tres sont !es rang1es et !es co!onnes$ Construction d&un Drid-aCout * new GridLayout(3,2);
nombre de lignes nombre de colonnes
I(
%rid'a(out "!
import java.awt.*; public class AppliGridLayout extends Frame { public AppliGridLayout() { super("AppliGridLayout"); this.setLayout(new GridLayout(3,2)); for (int i = 1; i < 7; i++) add(new Button(Integer.toString(i))); this.pack(); this.show(); } public static void main(String args[]) { AppliGridLayout appli = new AppliGridLayout(); } }
I0
%rid'a(out )!
-ors d'un redimensionnement !es composants changent tous de tai!!e mais !eurs positions re!ati es ne changent pas$
1 3 5
2 4 6
Redimensionnement
1 3 5
2 4 6
I2
%rid'a(out #!
Redimensionnement
I8
Card'a(out
-e CardLayout n&affiche qu&un composant > !a fois *
!es composants sont consid1r1es comme empi!1es+ > !a fa4on d&un tas de cartes$
-a pr1sentation CardLayout permet > p!usieurs composants de partager !e m.me espace d&affichage de te!!e sorte que seu! !&un d&entre eu) soit isib!e > !a fois$ /our a3outer un composant > un conteneur uti!isant un CardLayout i! faut uti!iser add(String cle, Component monComposant) /ermet de passer de ! 'affichage d 'un composant > un autre en appe!ant !es m1thodes first, last, next, previous ou show
I9
%rid*ag'a(out 1!
-e gestionnaire GridBagLayout fournit des fonctions de pr1sentation comp!e)es
bas1es sur une gri!!e dont !es !ignes et !es co!onnes sont de tai!!e ariab!es$ permet > des composants simp!es de prendre !eur tai!!e pr1f1r1e au sein d&une ce!!u!e+ au !ieu de remp!ir toute !a ce!!u!e$ permet aussi !&e)tension d&un m.me composant sur p!usieurs ce!!u!es$
%rid*ag'a(out 2!
-e gestionnaire DridJag-aCout est associ1 > un ob3et DridJagConstraints
!'ob3et "ri#$ag!onstraints d1finit des contraintes de positionnement+ d'a!ignements+ de tai!!e+ etc$ d'un composant dans un conteneur g1r1 par un "ri#$ag%a&out$ 5n associe chaque composant que !'on p!ace dans !e "ri#$ag%a&out a ec un ob3et "ri#$ag!onstraints
Un m.me ob3et "ri#$ag!onstraints peut-.tre associ1 > p!usieurs composants$ 61finir !es ob3ets "ri#$ag!onstraints en sp1cifiant !es diff1rents param7tres est asse, fastidieu)@ Voir !a doc
I? Hafidi Imad -ENSA de KhouribgaCours JAVA
01autres gestionnaires2
5n peut imposer > un ob3et K container L de n'a oir pas de gestionnaire en fi)ant son -aCoutManager > !a a!eur nu!!
Frame f = new Frame(); f.setLayout(null);
A !a charge a!ors du programmeur de positionner chacun des composants K manue!!ement L en indiquant !eur position abso!ue dans !e rep7re de !a fen.tre$ C'est > 1 iter+ sauf dans des cas particu!iers+$
(E
3capitulati.
A!oB-aCout
A!u) * composants p!ac1s !es uns derri7re !es autres
Jorder-aCout
Ecran d1coup1 en 2 ,ones "K North L+ K;est L+ K South L+ K East L+ K Center L#
Drid-aCout
Dri!!e * une case par composant+ chaque case de !a m.me tai!!e
Card-aCout
K 5ng!ets L * on affiche un 1!1ment > !a fois
DridJag-aCout
Dri!!e comp!e)e * p!usieurs cases par composant
(I Hafidi Imad -ENSA de KhouribgaCours JAVA
Chaque composant de !'A;< est con4u pour .tre !a source d'un ou p!usieurs tCpes d&1 1nements particu!iers$
(8
(9
(:
(?
Key
KeyListener
Focus
FocusListener
Mthodes actionPerformed (ActionEvent) itemStateChanged (ItemEvent) mouseDragged (MouseEvent) mouseMoved (MouseEvent) mousePressed (MouseEvent) mouseReleased (MouseEvent) mouseEntered (MouseEvent) (MouseEvent) mouseExited mouseClicked keyPressed (KeyEvent) keyReleased (KeyEvent) keyTyped (KeyEvent) focusGained (FocusEvent) focusLost (FocusEvent)
0F
Adjustment Component
AdjustmentListener ComponentListener
Window
WindowListener
Container Text
ContainerListener TextListener
adjustmentValueChanged (AdjustmentEvent) componentMoved (ComponentEvent)componentHiddent (ComponentEvent)componentResize (ComponentEvent)componentShown (ComponentEvent) windowClosing (WindowEvent) windowOpened (WindowEvent) windowIconified (WindowEvent windowDeiconified (WindowEvent) windowClosed (WindowEvent) windowActivated (WindowEvent) windowDeactivated (WindowEvent) componentAdded (ContainerEvent) componentRemoved(ContainerEvent) textValueChanged (TextEvent)
0E
;indoB-istener
Aermeture+ iconisation+ etc$ des fen.tres
<e)t-istener
Changement de a!eur dans une ,one de te)te
Item-istener
S1!ection d'un item dans une !iste
0I
MouseMotion-istener
61p!acement de !a souris+ dragRdrop a ec !a souris+ etc$
Ad3ustment-istener
61p!acement d&une 1che!!e
Component-istener
Sa oir si un composant a 1t1 cach1+ affich1 @
Container-istener
A3out d&un composant dans un Container
0( Hafidi Imad -ENSA de KhouribgaCours JAVA
KeC-istener
/our !a gestion des 1 1nements c!a ier
00
Implmentation de l'interface ActionListener On enregistre lcouteur devt action auprs de lobjet source "b" Lorsque l'on clique sur le bouton dans l interface, le titre de la fentre change
Les 2 boutons ont le mme couteur (la fentre) e.getSource()" renvoie l'objet source de lvnement. On effectue un test sur les boutons (on compare les rfrences)
Implmenter cette interface impose limplmentation de bcp de mthodes La fentre est son propre couteur WindowClosing() est appel lorsque l'on clique sur la croix de la fentre "System.exit(0)" permet de quitter une application java
Hafidi Imad -ENSA de KhouribgaCours JAVA
0:
Button b = new Button ("Sample") ; add (b) ; Hafidi b.addActionListener (...) ; Imad -ENSA de KhouribgaCours JAVA
CheckboxGroup cbg = new CheckboxGroup(); Checkbox one = new Checkbox("One", cbg, false); ... add(one); ...
2E Hafidi Imad -ENSA de KhouribgaCours JAVA
2(
slections multiples possibles ou non. Ici, avec la valeur false, non possible
Hafidi Imad -ENSA de KhouribgaCours JAVA
29
2:
2?
Utilisation de la classe prcdente (Ctrait) par une autre classe. Voir le fichier Dessin.java pour voir la manire exacte dont les 2 classes sont dfinies et utilises.
-es constantes de stC!e de po!ice sont en r1a!it1 des a!eurs enti7res+ parmi ce!!es cit1es ci-apr7s *
Font.BOLD Font.ITALIC Font.PLAIN Font.BOLD + Font.ITALIC
-es tai!!es en points doi ent .tre d1finies a ec une a!eur enti7re$
8( Hafidi Imad -ENSA de KhouribgaCours JAVA
Un Dialog n&est pas isib!e !ors de sa cr1ation$ Uti!iser !a m1thode shoB"# pour !a rendre isib!e "i! e)iste une m1thode hide"# pour !a cacher#$
80 Hafidi Imad -ENSA de KhouribgaCours JAVA
82
88
9wing
$+
Cette bib!ioth7que s&a3oute > ce!!e qui 1tait uti!is1e 3usqu&a!ors "AWT# pour des raisons de compatibi!it1$
Swing fait cependant doub!e emp!oi dans beaucoup de cas a ec AWT$ -&ambition de Sun est que+ progressi ement+ !es d1 e!oppeurs r1a!isent toutes !eurs interfaces a ec Swing et !aissent tomber !es anciennes A/I graphiques$
8:
8?
9F
9E
Atouts de 9wing
/!us de composants+ offrant p!us de possibi!it1s$ -es composants SBing d1pendent moins de !a p!ate-forme *
I! est p!us faci!e d&1crire une app!ication qui satisfasse au s!ogan "Write once, run everywhere"
9I
Con4entions de nommage
-es composants Swing sont situ1s dans !e paquetage javax.swing et ses sous paquetages$
Un certain nombre de paquetages d&e)tensions du !angage 3a a E$E "par opposition au) paquetages standards java# sont regroup1s sous javax$
Cette con ention permet de t1!1charger ces paquetages dans un en ironnement na igateur a ec une machine irtue!!e 3a a E$E$ Ces na igateurs ne sont+ en effet+ pas autoris1s > t1!1charger des paquetages dont !e nom commence par ja'a$
I!s portent des noms simi!aires > !eurs correspondants de A;< pr1c1d1s d&un J$
JFrame+ JPanel+ JTextField+ JButton+ JCheckBox+ JLabel+ etc$
9( Hafidi Imad -ENSA de KhouribgaCours JAVA
90
92
98
99
javax.swing.border
pour dessiner des bordures autour des composants
javax.swing.colorchooser
classes et interfaces utilises par le composant JColorChooser
javax.swing.event
les vnements gnrs par les composants Swing
javax.swing.filechooser
classes et interfaces utilises par le composant JFileChooser
9: Hafidi Imad -ENSA de KhouribgaCours JAVA
javax.swing.text
classes et interfaces pour la gestion des composants texte
javax.swing.tree
classes et interfaces pour grer les JTree
javax.swing.undo
pour la gestion de undo/redo dans une application
9? Hafidi Imad -ENSA de KhouribgaCours JAVA
J&rame
Anc.tre commun * c!asse JComponent
3a a$!ang$5b3ect Y W--3a a$aBt$Component Y W--3a a$aBt$Container Y W--3a a)$sBing$JComponent
-e JArame
Un objet JFrame a un comportement par d1faut associ1 > une tentati e de fermeture de !a fen.tre$
Contrairement > !a c!asse Frame+ qui ne r1agissait pas par d1faut+ !&action de fermeture sur un JFrame rend par d1faut !a fen.tre in isib!e$ Ce comportement par d1faut peut .tre modifi1 par setDefaultCloseOperation()$
:F Hafidi Imad -ENSA de KhouribgaCours JAVA
J&rame
0 comportements sont possib!es !ors de !a fermeture de !a fen7tre +O,NOTH-N",ON,!%OSE H-+E,ON,!%OSE +-SPOSE,ON,!%OSE E.-T,ON,!%OSE
import javax.swing.*; public class Simple { public static void main(String[] args) { JFrame cadre = new JFrame("Ma fenetre"); cadre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); cadre.setSize(300, 200); cadre.setVisible(true); } d1termine que !'app!ication sera termin1e } -orsqu'on fermera !a fen.tre
:E Hafidi Imad -ENSA de KhouribgaCours JAVA
Avec Swing JFrame monFrame = new JFrame ("Mon Frame"); JButton monBouton = new JButton ("Mon Bouton"); Container panneauContenu = monFrame.getContentPane(); panneauContenu.add(monBouton);
:I
:(
JPasswordField
un champ de saisie de mots de passe * !a saisie est in isib!e et !&affichage de chaque caract7re tap1 est remp!ac1 par un caract7re d&1cho "Z par d1faut#$
JEditorPane
un JTextComponent pour afficher et 1diter du code H<M($I et des formats te!s que G<A$
Hafidi Imad -ENSA de KhouribgaCours JAVA
:0
>/emple de J>ditorPane
import javax.swing.*; import java.awt.*; public class EditeurWEB { public static void main(String[] args) { JFrame monFrame = new JFrame ("Mon Frame"); monFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); try { JEditorPane monEditeur = new JEditorPane("http://www.google.fr"); Container panneauContenu = monFrame.getContentPane(); panneauContenu.setLayout(new FlowLayout()); panneauContenu.add(monEditeur); monFrame.pack(); monFrame.show();} catch (Exception e) {System.out.println(e.getMessage());}; } }
Hafidi Imad -ENSA de KhouribgaCours JAVA
:2
:9
des K !aCer L sont d1finis en natif et des constantes pour C acc1der e)istent dans !a c!asse$
::
Gepr1senter des !istes * c!asse JList Gepr1senter des arbres * c!asse JTree Gepr1senter des tab!es "E)ce!# * c!asse JTable Ces que!ques nou eaut1s ne sont qu&un aper4u de ce que propose SBing$
I! C a beaucoup de composants+ de nou eau) gestionnaires de pr1sentation+ de nou eau) 1 1nements graphiques que !'on ne peut pr1senter et d1tai!!er dans !e cadre de ce cours$
:? Hafidi Imad -ENSA de KhouribgaCours JAVA