Mise en page

Le gestionnaire de mise en page est responsable du positionnement et du dimensionnement des composants, en fonction de la place disponible. Un composant n'a donc pas le choix de sa taille, mais il peut exprimer des souhaits :

  • sa taille préférée,
  • sa taille minimum,
  • sa taille maximum.

Les différents tailles sont exprimées par des objets de la classe Dimension. Le constructeur de cette classe prend deux entiers en arguments : la largeur puis la hauteur. On peut choisir les tailles du composant en invoquant ses méthodes setPreferredSize, setMinimumSize ou setMaximumSize.

Les gestionnaires de mise en page respectent ces souhaits lorsque c'est possible. Cependant, ils sont parfois enclins à les ignorer. Par exemple, un composant dans la zone SOUTH d'un BorderLayout obtient généralement sa hauteur préferrée, mais sa largeur est étirée sans tenir compte de la largeur maximum.

Remarque Pour une fenêtre, la taille minimum permet de placer une limite inférieure sur le redimensionnement manuel.

Nous avons vu précédemment comment utiliser le gestionnaire de mise en page disponible par défaut dans une fenêtre : le BorderLayout. Il est utile dans certaines circonstances, mais pas dans toutes. Il existe d'autres classes de gestionnaires qui proposent une maquette différente.

GridLayout gestionnaire = new GridLayout(3, 5);
fenetre.setLayout(gestionnaire);
for(int i = 0; i < 15; i++)
  fenetre.add(new JButton(""+i));

Un GridLayout divise l'espace disponible en lignes et en colonnes (dont le nombre est choisi à la construction de l'objet). Chaque composant est ajouté à la grille de gauche à droite puis de haut en bas (l'ordre d'ajout est le seul moyen de choisir qui va où). Les composants sont étirés pour occuper toute la cellule qui leur est affectée.

FlowLayout gestionnaire = new FlowLayout(FlowLayout.CENTER);
fenetre.setLayout(gestionnaire);
for(int i = 0; i < 15; i++)
  fenetre.add(new JButton(""+i));

Un FlowLayout donne à tous les composants leur taille préferrée. Il place le plus possible de composants sur une seule ligne, de gauche à droite dans l'ordre où ils ont été ajoutés. Les composants sont séparés horizontalement par 5 pixels d'espace vide. La hauteur de la ligne est fixée par le composant le plus haut. On forme ainsi autant de lignes que nécessaire pour afficher tous les composants. Les lignes sont séparées verticalement par 5 pixels d'espace vide. Le gestionnaire peut être configuré pour justifier les lignes à gauche, à droite, ou au milieu.

Un panneau (de la classe JPanel) est un composant qui peut contenir d'autres composants. En plus de permettre de hiérarchiser les composants de l'interface graphique, cela nous donne le moyen de combiner plusieurs gestionnaires de mise en page. En effet, le panneau utilise son propre gestionnaire (un FlowLayout par défaut) pour placer les composants qu'il contient.

JPanel panneau = new JPanel();
panneau.setBackground(Color.ORANGE);
JButton bouton = new JButton("OK");
panneau.add(bouton);
JButton bouton2 = new JButton("Annuler");
panneau.add(bouton2);
fenetre.add(panneau, BorderLayout.SOUTH);
JTextArea zoneDeTexte = new JTextArea("Composez votre message");
zoneDeTexte.setBackground(Color.CYAN);
fenetre.add(zoneDeTexte, BorderLayout.CENTER);

  1. Choix. Reprenez l'exercice 4 du sujet sur les composants et ajoutez la quatrième maison, Poufsouffle.

    La mise en page reste peu satisfaisante lorsque la fenêtre est trop petite. Limitez sa taille à des dimensions raisonnables.

  2. Damier. Écrivez une application qui ouvre une fenêtre ayant l'apparence suivante :

    Le nombre de lignes (qui est égal au nombre de colonnes) devra être passé sur la ligne de commande.

  3. Question. Écrivez une application qui ouvre une fenêtre ayant l'apparence suivante :

    La question et les réponses devront rester au centre de la fenêtre en cas de redimensionnement.

  4. Rose. Écrivez une application qui ouvre une fenêtre ayant l'apparence suivante :

  5. Piège. Écrivez une application qui ouvre une fenêtre ayant l'apparence suivante :

    Cet exercice est un piège ! Les gestionnaires de mise en page que nous avons vu ne permettent pas de réaliser une telle configuration, même en combinaison. Il est possible dans ce cas de poser les composants «manuellement». On désactive d'abord le gestionnaire actuel avec :

    fenetre.setLayout(null);

    Puis on peut décider de la position et de la taille d'un composant en utilisant ses méthodes setLocation et setSize (comme pour une fenêtre).

    Remarque Cette façon de faire est rarement employée car la mise en page n'est plus dynamique : en cas de redimensionnement, les composants ne s'adaptent pas.

retour à la page d'accueil

retour au sommet