• Aucun résultat trouvé

L’association d’une stratégie de placement à un conteneur se fait en

– instanciant un objet de la classe dérivée de LayoutManager représentant la stratégie choisie,

– Puis, en invoquant sur le conteneur la méthode setLayout(LayoutManager layout) pour spécifier le gestionnaire de disposition qui lui est associé

– Puis, appel de la méthode add( ) qui permet d’ajouter des composants dans un conteneur:

Elle possède plusieurs formes d’appel, en fonction du gestionnaire choisi.

Les principaux gestionnaires mis à disposition par swing et l’awt:

– BorderLayout. [awt]

– FlowLayout. [awt]

– GridLayout. [awt]

– BoxLayout. [swing]

– GridBagLayout. [awt]

– null.

– …….

Remarque

– On peut créer des dispositions personnalisées, ou ceux de Sun ou d’autres fournisseurs – Les interfaces utilisateur sont constituées, en général, de différentes dispositions, sous

forme de panneaux imbriqués les uns dans les autres.

M.AFILAL 139

FlowLayout

FlowLayout est un conteneur dont les composants sont placés dans l’ordre de leur ajout.

Ils sont alignés de gauche a droite, puis de haut en bas

Un composant est placé dans un FlowLayout en utilisant la méthode add.

Il y a plusieurs constructeurs possibles:

– FlowLayout( ); //  FlowLayout(FlowLayout.CENTER, 5, 5).

– FlowLayout( int align);

Permet de préciser l'alignement des composants dans le conteneur (CENTER, LEFT, RIGHT ... ). Par défaut, align vaut CENTER

– FlowLayout( int, int hgap, int vgap);

Permet de préciser l'alignement horizontal et vertical dont la valeur par défaut est 5.

M.AFILAL 140

Exemple

import javax.swing.*;

import java.awt.*;

public class TesteFlowLayout extends JFrame {

– String tab[ ] = { "un", "deux", "trois", "quatre", "cinq", "six"};

– public TesteFlowLayout() {

super("Teste de FlowLayout");

getContentPane().setLayout(new FlowLayout());

for (int i = 0; i < tab.length; i++) {

– getContentPane( ).add(new JButton(tab[i]));

}

pack();

– } }

M.AFILAL 141

Exemple

Remarque

– La méthode getPreferedSize() indique la taille souhaitée mais pas celle imposée.

– En fonction du Layout Manager, le composant pourra ou non imposer sa taille.

Layout Hauteur Largeur

Sans Layout oui oui

FlowLayout oui oui

BorderLayout(East, West) non oui

BorderLayout(North, South) oui non

BorderLayout(Center) non non

GridLayout non non

M.AFILAL 142

BorderLayout

Le conteneur est divisé en cinq zone nommées "géographiquement" : – NORTH, SOUTH, EAST, WEST, CENTER.

Les composants au Nord et au Sud

– gardent une hauteur constante mais possèdent toujours comme largeur celle du conteneur.

Les composants a l’Est et a l’Ouest

– gardent leur largeur constante mais leur hauteur s’adapte de façon a ce qu’ils comblent toujours l’espace libre

entre le bas du composant au Nord et le haut du composant Sud.

Le composant au Centre occupe tout le reste de l’espace disponible au centre, donc sa largeur et sa hauteur changent.

BorderLayout consacre tout l'espace du conteneur aux composants Constructeur

– BorderLayout();

– BorderLayout(hgap, vgap);

Hgap(espace horizontal) et vgap(espace vertical) déterminent la distance entre les composants (entre les zones)

M.AFILAL 143

M.AFILAL 144

Exemple *

public class TesteBorderLayout extends JFrame {

– String tab[] = { "NORD", "SUD", "OUEST", "EST", "CENTRE"};

– public TesteBorderLayout() {

super("Teste de BorderLayout");

getContentPane().setLayout(new BorderLayout());

getContentPane().add(new JButton(tab[0]), BorderLayout.NORTH);

getContentPane().add(new JButton(tab[1]), BorderLayout.SOUTH);

getContentPane().add(new JButton(tab[2]), BorderLayout.WEST);

getContentPane().add(new JButton(tab[3]), BorderLayout.EAST);

getContentPane().add(new JButton(tab[4]), BorderLayout.CENTER);

pack();

– } }

Remarque:

– On peut utiliser la surcharge de la méthode add afin d’ajouter les composants dans le panneau, comme ceci:

add("Center", new JButton(tab[4]));

M.AFILAL 145

GridLayout

Le gestionnaire GridLayout place les composants sur une grille de cellule dont on spécifie:

– le nombre de ligne ou le nombre de colonne et l’espace (en pixels) entre les cellules lors de la création du GridLayout.

Toutes les cellules ont obligatoirement la même hauteur (celle du composant le plus haut) et même largeur(celle du composant le plus large)

Chaque cellule contient un seul composant (simple ou conteneur) – qui occupe toute la place disponible dans la cellule

Outre le nombre de lignes et de colonnes qu’on peut spécifier,

– on peut spécifier le nombre de pixels entre les cellules en utilisant les paramètres d’espace horizontal (hgap) et d’espace vertical (vgap)

Constructeurs:

– GridLayout(lignes, colonnes);

– GridLayout(lignes, colonnes, hgap, vgap);

M.AFILAL 146

GridLayout

Remarque:

– L’espace horizontal et l’espace vertical sont nuls par défaut

– Pour créer un GridLayout de 5 lignes, 8 colonnes, des espacements horizontaux et verticaux de valeurs respectives 10 et 20 puis de l’associé à un conteneur, on fait:

unConteneur.setLayout(new GridLayout(5, 8, 10, 20));

– Pour ajouter des composants dans un GridLayout, on utilise la méthode add. Les composants sont placés dans l’ordre, ligne par ligne, en remplissant chaque ligne.

– Lorsque le nombre de ligne et de colonne est spécifié alors le nombre de colonne est ignoré.

Ainsi par Exemple GridLayout(5,4) est équivalent à GridLayout(5,0). On aura 5 lignes (avec des lignes vides possibles, en fonction du nombre des composants à insérer)

– GridLayout(0,4): on aura 4 colonnes (avec des colonnes vides possibles ou des cases vides, en fonction du nombre des composants à insérer)

M.AFILAL 147

M.AFILAL 148

Exemple

public class TesteGridLayout extends JFrame {

– String tab[] = { "un", "deux", "trois", "quatre", "cinq", "six"};

– public TesteGridLayout() { super("Teste GridLayout");

getContentPane().setLayout(new GridLayout(3, 2, 10, 10));

for (int i = 0; i < tab.length; i++) {

– getContentPane().add(new JButton(tab[i]));

}

pack();

– } }

M.AFILAL 149

CardLayout

Ce gestionnaire est typiquement utilisé pour simuler le comportement de Boite à angle ou carte de jeux:

– dans lesquelles le haut de la fenêtre contient un ensemble de boutons, ou autre ensemble (un jcombobox, ..), permettant de passer d’un anglet a l’autre.

Ce gestionnaire de disposition n’affiche qu’un seul composant à la fois, – on utilise (généralement) des panneaux (JPanel) comme composants.

Le composant affiché occupe toute la place disponible.

Les composants placés peuvent être indexés par des mots-clés

M.AFILAL 150

CardLayout

Plusieurs méthodes permettent de sélectionner le composant à afficher, notamment : – next (Container c)

cache le composant actuellement affiché et affiche le suivant dans la liste.

– previous (Container c)

cache le composant actuellement affiché et affiche le précèdent dans la liste – last( )

affiche le dernier composant, – first( )

affiche le premier composant, Remarque

– l’ordre d’affichage est celui dans lequel on a ajouté les composants.

– La méthode show (Container, String) permet de spécifier par son index le composant à afficher.

– Il est préférable d’utiliser un TabbedPane à la place d’un cardLayout.

M.AFILAL 151

CardLayout

M.AFILAL 152

Exemple

import javax.swing.*; import java.awt.*; import java.awt.event.*;

public class TesteCardLayout extends JFrame implements ActionListener{

String tab[ ] = { "un", "deux", "trois", "quatre", "cinq", "six"};

public TesteCardLayout() { setTitle("Teste cardLayout");

getContentPane().setLayout(new BorderLayout());

JPanel nord = new JPanel(new FlowLayout());

JPanel centre = new JPanel(new CardLayout());

for (int i = 0; i < tab.length; i++) {

JButton but = new JButton(tab[i]);

nord.add(but);

but.addActionListener(this);

centre.add(tab[i], new JButton("ONGLET " + tab[i]));

}

getContentPane().add(nord, BorderLayout.NORTH);

getContentPane().add(centre, BorderLayout.CENTER);

pack();

}

public void actionPerformed (ActionEvent e) {

( (CardLayout) ( (JPanel) getContentPane().getComponent(1)).getLayout()). show((JPanel) (getContentPane().getComponent(1)), ( (JButton) e.getSource()).getText());

} }

M.AFILAL 153

BoxLayout

Ce gestionnaire de disposition permet d’aligner les composants selon un axe horizontal (une seule ligne) ou un axe vertical (une seule une colonne).

– Les axes sont définis par les constantes :

X_AXIS (horizontale) et Y_AXIS (verticale),

LINE_AXIS et PAGE_AXIS (dépendent de l'orientation: propriétés de l’objet ComponentOrientation)

Ce gestionnaire de disposition organise les composants, en respectant l’ordre d’addition, sur une seule ligne (axe vertical ) ou une seule colonne(axe horizontal)

Les composants sont ajoutés

– de gauche à droite pour une ligne,

– de haut en bas pour une colonne (depuis la gauche par défaut).

Lorsque la ligne ou la colonne est pleine, on ne déborde pas, mais il y a réduction ou masquage.

En utilisant

– composant. setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT), dans le cas d’alignement LINE_AXIS et PAGE_AXIS, l’ajout sera

de droite vers la gauche pour une ligne

de haut vers le bas mais depuis la droite pour une colonne Remarque:

– JMenuBar et Box utilisent un BoxLayout comme gestionnaire de disposition.

M.AFILAL 154

Avec BoxLayout:

– chacun des composants utilise une place variable en fonction de ses dimensions PreferredSize et MaximalSize

– les composants sont alignés en fonction de leur paramètre alignementX et alignementY Arrangement selon l’axe primaire:

– Ce gestionnaire permet à chaque composant d’occuper un espace spécifique selon l’axe primaire.

– Si on choisit l’axe vertical comme axe primaire,

un JTextField occupera moins de place verticalement qu’un JTextArea.

BoxLayout

M.AFILAL 155

Arrangement selon l’axe complémentaire

– S’il s’agit d’un BoxLayout horizontal (l’axe primaire = BoxLayout.X_AXIS ou BoxLayout.LINE_AXIS),

le gestionnaire tentera de rendre chaque composant aussi haut que le plus haut parmi tous les composants.

– S’il s’agit d’un BoxLayout vertical (l’axe primaire = BoxLayout.Y_AXIS ou BoxLayout.PAGE_AXIS),

le gestionnaire tentera de rendre chaque composant aussi large que le plus large parmi tous les composants.

– Si le composant ne peut s’accroître de cette manière (sachant que la size max est donné par getMaximumSize()),

le gestionnaire appliquera les propriétés Y-Alignement ou X-Alignement du composant afin de déterminer comment placer le composant au sein de l’espace disponible.

Constructeur:

– new BoxLayout(unConteneur, BoxLayout.Y_AXIS);

Le premier paramètre correspond à un conteneur (un Panel en général), et le second indique l’axe primaire: X_AXIS ou LINE_AXIS ou Y_AXIS ou PAGE_AXIS.

– Pour ajouter un composant dans le conteneur, on utilise la méthode add:

Add(unComposant)

BoxLayout

M.AFILAL 156

Documents relatifs