Cours Java (INHM)
MASTER
Catherine
RECANATI
L.I.P.N. (Laboratoire dInformatique de Paris Nord)
Universit de Paris 13
[Link]
287
Plan du cours
Chapitre 1 : un survol de Java. Chapitre 2 : complments sur le langage. (classes abstraites, interfaces, String et StringBuffer, Threads, le package d'entres/sorties [Link]) Chapitres 3, 4, 5 et 6 : Java Swing. (composants, afficheurs, vnements, dessins, images , dialogues et animation).
288
Chapitre 4 : Les composants
Composants Swing Principaux composants: boutons, menus, barre de menus, composants textes, tables et listes Les afficheurs associs aux conteneurs
289
Les composants Swing
JComponent hrite de Component et de Container. La classe fournit en outre un support pour : A pluggable look and feel (plaf). des infos bulles ou tooltips (classe JTooltip). le scrolling automatique des listes, tables, arbres (via l'interface Scrollable). le dbugage des graphiques (avec la classe DebugGraphics).
290
Les composants Swing
Nouvelles caractristiques des JComponent : >Double buffering. >Accessibilit (aux handicaps). >Bordures : il y a 8 classes de bords. >Gestion des touches clavier. >Proprits des composants (paires de nom/valeur (=objet)) : peuvent tre associes nimporte quel composant Swing; permettent d'associer un composant swing avec un autre objet sans tendre la classe.
291
Les composants Swing
> Composants de base: des boutons, champs de textes, menus, JComboBox, JList, JSlider. > Composants non modifiables : JLabel, JProgressBar, JToolTip. > Composants modifiables : plusieurs diteurs de textes, JColorChooser, JFileChooser, JTree.
292
Les composants Swing
> Cadres de haut niveau: JFrame, JApplet, JDialog. > Conteneurs gnraux: JPanel, JScrollPane, JSplitPane, JTabbedPane, JToolBar. > Conteneurs spcialiss: JInternalFrame, JLayeredPane, JRootPane.
293
Boutons
JComponent AbstractButton
JToggleButton
JButton
JCheckBox
JRadioButton
294
Boutons
> JButton dfinit un bouton standard. > JToggleButton dfinit un bouton deux tats. Il existe en deux versions : JCheckbox et JRadioButton . > Les toggle buttons peuvent tre regroups dans un mme ButtonGroup de sorte quun seul lment du groupe puisse tre simultanment slectionn. > La classe JToolBar permet de crer une barre doutils contenant divers boutons.
295
Menus
Swing supporte des menus contextuels (menus pop-up) et des barres de menus
JComponent JMenuBar AbstractButton JMenuItem
JRadioButtonMenuItem
JPopupMenu
JMenu
JCheckBoxMenuItem
296
Menus
> JMenuBar : barre de menus dune fentre dapplication. > Un objet JMenu est une option de niveau suprieur dans une barre de menus qui fait drouler une liste doptions quand on clique dessus. Les options de tels menus sont dfinies par la classe JMenuItem.
297
Menus
> JPopupMenu : cest un menu contextuel (habituellement implment pour apparatre la position courante du curseur quand le bouton droit de la souris est enfonc). > JCheckBoxMenuItem : option de menu dote dune case cocher quand loption est slectionne.
298
Ajout de menus
> JMenuBar: implmente la barre de menus place en haut d'une fentre > On ajoute des objets JMenu ou JMenuItem dans une JMenuBar avec la mthode add et ces objets apparatront dans la barre de menus
299
Menu et item de menu
> Un objet JMenu possde un label, et quand on clique dessus, il droule un menu d'items. > Un objet JMenuItem est un simple item de menu visualis par un label. Quand on clique dessus, il peut invoquer un programme. Un JMenuItem peut galement afficher un icne en sus de son label.
300
Menu et item de menu
> Les items dun JMenu (menu droulant d'une barre de menu) peuvent tre de simples JMenuItem, JCheckBoxMenuItem, JRadioButtonMenuItem, ou eux-mmes des JMenu (sous-menus). > On les ajoute au JMenu avec la mthode add.
301
Crer une barre de menus
import [Link].*; // extrait du livre de Ivor Norton // "Maitrisez Java 2" Public class Sketcher { static SketcherFrame window; /la fentre cadre dapplication public static void main(String[] args) { window = new SketcherFrame(Sketcher); Toolkit leKit = [Link](); Dimension wndSize = [Link](); [Link]([Link]/4, [Link]/4, [Link]/2, [Link]/2); [Link](true); } }
302
Crer une barre de menus
import [Link].*; Public class SketcherFrame extends JFrame { private JMenuBar menuBar = new JMenuBar(); public SketcherFrame (String titre) { setTitle(titre); setDefaultCloseOperation(EXIT_ON_CLOSE); setJMenuBar (menuBar); JMenu leMenu = new JMenu(File); JMenu elementMenu = new JMenu (Elements); [Link](leMenu); [Link](elementMenu); } }
303
Crer une barre de menus
304
Ajouter un raccourci
> Un raccourci (ou mnmonique) est une combinaison de cls utilise pour slectionner un menu dans la barre de menus. Sous Windows: ALT+une lettre du label du menu. [Link](F); La lettre F du titre File apparait alors souligne. > Un acclrateur est une combinaison de touches utilise pour slectionner une option dans un menu. Sous Windows: Ctrl+une lettre.
305
Ajouter un acclrateur
[Link]([Link] (L,Event.CTRL_MASK));
La classe KeyStroke dfinit une combinaison de touches. getKeyStroke retourne lobjet correspondant (il combine ses arguments). La classe Event dfinit les constantes SHIFT_MASK, ALT_MASK et CTRL_MASK. Pour combiner les touches Alt et Ctrl, on peut utiliser Event.ALT_MASK + Event.CTRL_MASK
306
Composants textes
Il existe une grande varit de composants textes dans Swing
JComponent JTextComponent JEditorPane JTextField JTextPane JPasswordField JTextArea
307
JLabel
Composants textes
> JLabel : le plus simple. Compltement passif, je non ditable. suis un label > JTextField : une seul champ de texte, ditable. > JTextArea : plusieurs lignes de texte, ditable :
bla bla bla bla bla bla bla
Les scrollbars peuvent tre gres automatiquement
308
Composants textes
> JPasswordField permet de lire un mot de passe (masqu pour l'utilisateur). > JEditorPane et JTextPane : composants plus complexes permettant dimplanter des fonctions ddition labores comme celles prvues pour les formats html ou rtf. > JTextPane permet dinclure des images au sein des lments de textes.
309
Autres composants utiles
> JList : une liste dlments. Sert slectionner des lments. On peut prciser le mode de slection. > JTable : gre un tableau dlments en lignes et colonnes. On peut slectionner une ligne, une colonne ou un lment. > JPanel : (conteneur) sert regrouper des composants, par exemple des boutons. On en utilise frquemment plusieurs.
310
Conteneurs et afficheurs associs
311
Accs aux composants d'un conteneur
Les composants ajouts un conteneur sont stocks dans un tableau Component associ au conteneur. On peut y accder avec : > int getComponentCount() > Component getComponent(int index) > Component[] getComponents()
312
Exemple
Supposons que l'on ait un objet de type Container
(par exemple le panneau dun JFrame), nomm content. On peut crire :
Component aComponent = null; int numComponents = [Link](); for(int i = 0; i < numComponents; i++ ) { aComponent = [Link](i); // faire quelque chose avec ce composant... }
313
Ajouts d'lments
Pour ajouter un composant au conteneur, on utilise une version de add
> Component add (Component c) > Component add(Component c, int index) (si lindex vaut -1, ajoute c la fin) > void add(Component c, Object constraints) (ajoute c la fin du tableau, et sa disposition sera soumise aux contraintes spcifies par l'objet constraints pour l'afficheur associ) > void add(Component c, Object constraints, int index)
314
Rappel
La disposition des objets inclus dans un conteneur est assure par un autre objet qui implmente l'interface
LayoutManager
Cet objet gre l'affichage des objets du conteneur. C'est un
Afficheur
315
interface LayoutManager
> Un afficheur est un objet qui implmente linterface LayoutManager. > Il dtermine la mise en page (position et taille) des composants l'intrieur du conteneur, lors de l'affichage ou lors d'un changement de taille. > Il y a plusieurs afficheurs dans awt et swing, et on peut en dfinir d'autres. > Il y en a 6 principaux.
316
Afficheurs
> FlowLayout : place les objets sur des lignes successives comme le ferait un traitement de texte. Souvent utilis pour des boutons. Cest l'afficheur par dfaut associ aux JPanel. > BorderLayout : place les objets contre les bords ou au centre. C'est l'afficheur par dfaut du panneau de contenu des JFrame,JDialog et JApplet. > CardLayout : place les objets les uns sur les autres. Seul le sommet de pile est visible un moment donn.
317
Afficheurs
> GridLayout : place les objets sur une grille dont on peut spcifier le nombre de lignes et de colonnes. > GridBagLayout : place galement les lments sur une grille, mais la hauteur des lignes et la largeur des colonnes peut varier. Assez complexe dutilisation, il offre cependant une grande souplesse de contrle. > BoxLayout : dispose les composants soit en ligne, soit en colonne. C'est l'afficheur associ la classe Box.
318
Afficheurs
> BoxLayout [et Box] sont dfinis dans swing. Les autres dans awt. > Pour modifier l'afficheur associ un conteneur, on utilise setLayout(). Exemple: pour changer la mise en page du panneau de contenu dun JFrame
JFrame myWindow = new JFrame("Ma fentre"); FlowLayout flow = new FlowLayout(); [Link]().setLayout(flow);
319
Afficheur FlowLayout
import [Link].*; import [Link].*; Public class TryFlowLayout { static JFrame awindow= new JFrame("Ceci est un FlowLayout"); public static void main(String[] args) { Toolkit leKit = [Link](); Dimension wndSize = [Link](); [Link]([Link]/4, [Link]/4, [Link]/2, [Link]/2); [Link](JFrame.EXIT_ON_CLOSE); 320
Afficheur FlowLayout
FlowLayout ow = new FlowLayout(); Container content = [Link](); [Link](ow); // Ajoutons six boutons for ( int i=1; i<= 6 ; i++ ) [Link]( new JButton ( " Press " + i ); [Link](true); } }
321
Afficheur FlowLayout
Centr par dfaut : Avec changement de la taille de la fentre :
322
Afficheur FlowLayout
avec
FlowLayout flow = new FlowLayout([Link]);
323
Afficheur FlowLayout
Par dfaut, espacement de 5 pixels entre les composants dune ligne, ou colonne. Pour le changer :
FlowLayout flow = new FlowLayout([Link],20,30);
324
Essai avec un applet
325
Afficheur BorderLayout
import [Link].* ; // pour les bords des boutons // le reste identique ce qui prcde BorderLayout border = new BorderLayout(); Container content = [Link](); [Link](border); EtchedBorder edge = new EtchedBorder([Link]); // Ajoutons cinq boutons: un chaque bord + un au centre JButton button; [Link] (button = new JButton("EST") , [Link]); [Link](edge); // bord du bouton [Link] (button = new JButton("OUEST"), [Link]); [Link](edge); // etc. avec NORTH, SOUTH et CENTER 326
Afficheur BorderLayout
327
Afficheur CardLayout
> L'afficheur CardLayout gre une pile de composants, comme un paquet de cartes. Le premier lment ajout est mis en haut, et le dernier en bas. Seul le sommet est rendu visible. > On peut prciser des espaces (gaps) au constructeur du CardLayout : distances entre le bord du composant et le bord du conteneur.
328
Afficheur CardLayout
espaces
329
Afficheur CardLayout
> Remarquez les deux arguments passs la mthode add : le second identifie le composant par un Object, ici une String. > void show(Container parent, String name) // permet alors de slectionner le composant // par la chane passe en argument add. > void previous (Container parent) // slectionne le prcdent > mme chose avec last, next, first
330
Afficheur GridLayout
Il dispose les objets sur une grille rectangulaire. Il y a trois constructeurs : > GridLayout() // 1 seule ligne > GridLayouts( int nrows, int ncols) > GridLayout(int nrows, int ncols, int hgap, int vgap) // prcise les espacements (gaps) // entre les lignes et les colonnes
331
Afficheur GridLayout
Avec les deux derniers constructeurs, on peut mettre le nombre de lignes ou le nombre de colonnes 0 (ou exclusif). Si lun des deux est nul, le GridLayout fournit le nombre de lignes ou de colonnes ncessaire selon ce qui est ajout.
332
Afficheur GridLayout
Avec
GridLayout grid = New GridLayout( 3, 4, 30, 20) ;
333
Afficheur BoxLayout
Il organise les composants sur une seule ligne ou une seule colonne (ex: JMenuBar utilise un BoxLayout. C'est aussi l'afficheur de la classe Box).
> Les composants sont ajouts de gauche droite pour une ligne, de haut en bas pour une colonne. > Lorsque la ligne ou la colonne est pleine, on ne dborde pas, mais il y a rduction ou masquage.
334
Afficheur BoxLayout
> Le gestionnaire BoxLayout essaie de donner la mme hauteur aux composants dune ligne, et la mme largeur aux composants d'une colonne. > La classe Box (sous-classe de Container) a un BoxLayout pour afficheur. C'est une classe trs utile : elle est dun maniement plus simple que JPanel et elle possde des constructeurs intressants (en particulier pour grer les espaces).
335
La classe Box
336
La classe Box
337
La classe Box
338
La classe Box
Pour amliorer la disposition des lments on peut : rgler les espaces entre les lments : composants Strut et Glue (pour avoir un menu Aide droite dans une barre de menus par exemple), Filler et Rigid Area. enjoliver les cadres : utiliser des JPanel pour contenir les Box, et leur mettre des bords (avec titres ou autres).
339
Exemple avec 2 BoxLayout
BoxLayout vertical
BoxLayout horizontal
BorderLayout
340
Exemple avec 2 BoxLayout
JScrollPane listScroller = new JScrollPane(list); [Link](new Dimension(250, 80)); [Link](new Dimension(250, 80)); [Link](LEFT_ALIGNMENT); ... JPanel listPane = new JPanel(); // avec BoxLayout vertical [Link](new BoxLayout(listPane, BoxLayout.Y_AXIS)); JLabel label = new JLabel(labelText); [Link](label); [Link]([Link](new Dimension(0,5))); [Link](listScroller); [Link]([Link](10,10,10,10)); 341
Exemple avec 2 BoxLayout
JPanel buttonPane = new JPanel(); // BoxLayout horizontal [Link](new BoxLayout(buttonPane, BoxLayout.X_AXIS)); [Link]([Link] (0, 10, 10, 10)); [Link]([Link]()); [Link](cancelButton); [Link]([Link] (new Dimension(10, 0))); [Link](setButton); Container contentPane = getContentPane(); [Link](listPane, [Link]); [Link](buttonPane, [Link]);
342
Afficheur GridBagLayout
Dispose les composants sur une grille dont la taille des cellules peut varier. > Un composant est plac sur une cellule dans la grille (sa position) mais il peut occuper plusieurs cellules en hauteur ou en largeur. > Chaque composant possde un jeu de contraintes prcisant la mise en page. On peut les dfinir via un objet GridBagConstraints que lon associe au composant (avec setConstraints) avant de lajouter au conteneur.
343
GridBagConstraints
gridx, gridy : origine (en cellules) dans la grille. gridwidth, gridheight : zone alloue (en cellules). weightx, weighty : comment lespace libre en x et y est redistribu entre les composants en cas de changement de taille de la grille. anchor : ancrage du composant au sein de sa zone. ipadx, ipady : de combien la taille du composant doit tre augmente au-del de sa taille minimale. fill : comment le composant doit tre redimensionn pour remplir la zone qui lui est alloue. insets : espaces qui peuvent tre ajouts autour du composant au sein de la zone alloue. 344
Constantes de GridBagConstraints
gridx, (gridy): [Link] = aprs le dernier composant ajout. gridwidth, (gridheight): [Link] = aprs le dernier dans cette colonne (ou range). [Link] = le dernier de cette colonne ou range. fill: [Link], [Link], [Link], [Link].
345
Exemple: GridBagLayout
346
Positionnement absolu
public class NoneWindow extends JFrame { private JButton b1, b2, b3; public NoneWindow() { Container contentPane = getContentPane(); [Link](null); b1 = new JButton("un"); [Link](b1); b2 = new JButton("deux"); [Link](b2); b3 = new JButton("trois"); [Link](b3);
347
Positionnement absolu
Insets insets = [Link](); [Link](25 + [Link], 5 + [Link], 75, 20); [Link](55 + [Link], 35 + [Link], 75, 20); [Link](150 + [Link], 15 + [Link], 75, 30); ... } ... }
348