Mise en page d'une interface graphique

BoxLayout

Dans le programme précédemment réalisé avec un BorderLayout, le fait de placer l'écran en position PAGE_START fait qu'il aura une hauteur assez réduite par-rapport à l'élément en position CENTER qui est le clavier.
Pour obtenir une répartition plus égalitaire de l'espace dévolu aux différents éléments, un layout manager plus adapté est le BoxLayout : il place les éléments les uns en dessous des autres, ou les uns à côté des autres, dans l'ordre d'ajout.
On va donc modifier Grille.java pour donner à la fenêtre un LayoutManager de type BoxLayout.
Sauvegarder Grille.java sous le nom Boite.java et faire les ajustements de noms nécessaires, ainsi que les modifications indiquées ci-dessous en violet.
import javax.swing.*;
import java.awt.*;

class Boite extends JFrame{
  JButton[] clavier=new JButton[12];
  JTextField ecran;
  Boite(){
    super();
    setTitle("GridLayout + BoxLayout");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    getContentPane().setLayout(new 
	        BoxLayout(getContentPane(),BoxLayout.PAGE_AXIS));

    JPanel haut=new JPanel();
    haut.setLayout(new GridLayout(1,1));

    ecran=new JTextField();
    ecran.setFont(new Font(Font.SANS_SERIF,Font.PLAIN,34));
    ecran.setBackground(Color.white);
    ecran.setEditable(false);

    haut.add(ecran);
    getContentPane().add(haut);

    JPanel bas=new JPanel();
    bas.setLayout(new GridLayout(4,0,2,2));

    for (int i=0;i<9;i++){
      clavier[i]=new JButton(new Integer(i+1).toString());
    }
    clavier[9]=new JButton("0");
    clavier[10]=new JButton(",");
    clavier[11]=new JButton("C");

    for (int i=0;i<12;i++){
      clavier[i].setFont(new Font(Font.SANS_SERIF,Font.BOLD,34));
      bas.add(clavier[i]);
    }	

    getContentPane().add(bas);
    setPreferredSize(new Dimension(250,450));
    setLocation(400,400);
    setMinimumSize(new Dimension(210,310));
    pack();
    setVisible(true);
  }
  public static void main(String[] args) {
    new Boite();
  }  
}
 

La ligne

getContentPane().setLayout(new
        BoxLayout(getContentPane(),BoxLayout.Y_AXIS));
affecte un BoxLayout au getContentPane() de la fenêtre , avec l'option Y_AXIS qui veut dire que les composants s'aligneront sur un axe vertical. (pour obtenir un alignement horizontal on utilise l'option X_AXIS, comme vous l'aurez deviné).

Il n'y a plus ensuite qu'à ajouter au ContentPane de la fenêtre les composants "haut" et "bas", qui s'aligneront l'un sous l'autre dans l'ordre d'ajout.


Remarque : plutôt que de modifier le layout de la fenêtre, on peut placer à l'intérieur un composant de type Box, qui a par défaut un BoxLayout, puis placer les JPanels dans cette Box. Pour cela dans Boite.java on remplace la ligne
getContentPane().setLayout(new 
         BoxLayout(getContentPane(),BoxLayout.PAGE_AXIS));
par
Box boite_interne=new Box(BoxLayout.Y_AXIS);
getContentPane().add(boite_interne);
et les lignes getContentPane().add(haut); et getContentPane().add(bas);
par boite_interne.add(haut); et boite_interne.add(bas);
Exercice : écrire un programme Box réalisant l'interface voulue en utilisant uniquement des BoxLayout (il faudra utiliser plus de 2 JPanels ou Box)
 
Licence Creative Commons
licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 non transposé
Auteur : Nathalie Bonnin
Professeur de Physique, Chimie, Informatique au lycée La Martinière Monplaisir (Lyon 8ème)
Contact :
nathalie.bonnin (chez) scientillula.net
Licence Creative Commons
La totalité du contenu du site Scientillula.net appartient à Nathalie Bonnin et est mise à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 non transposé