Mise en page d'une interface graphique

Positionnement absolu

Enregistrer le fichier Base.java sous un autre nom, par exemple Fixe.java, en changeant le nom de la classe en conséquence.
On va utiliser pour chaque composant sa méthode setBounds(x,y,largeur, hauteur) pour pouvoir simultanément le dimensionner et le placer dans la fenêtre. Il faudra préalablement avoir désactivé le gestionnaire de positions par défaut de la fenêtre personnalisée, en ajoutant dans son constructeur la ligne setLayout(null);
La disposition réalisée sera la suivante :

Les espaces au-dessus, à gauche et entre les composants seront de 2 pixels.
import javax.swing.*;
import java.awt.*;

class Fixe extends JFrame{
  JButton[] clavier=new JButton[12];
  JTextField ecran;
  Fixe(){
    super();
    setTitle("Fixe");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    getContentPane().setLayout(null);
    ecran=new JTextField();
    ecran.setFont(new Font(Font.SANS_SERIF,Font.PLAIN,34));
    ecran.setBackground(Color.white);
    ecran.setEditable(false); 
    ecran.setBounds(2,2,289,80);
    getContentPane().add(ecran);
 
    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));
      clavier[i].setBounds(2+97*(i%3), 84+(i/3)*97, 95, 95);	
      getContentPane().add(clavier[i]);
    }

    setBounds(400,400,300,500);
    setResizable(false);
    setVisible(true);
  }

  public static void main(String[] args) {
    new Fixe();
  }
}
Les modifications apportées par-rapport à Base.java sont en violet.

La ligne

ecran.setBounds(2,2,289,80);
place le JTextField à 2 pixels du bord gauche, 2 pixels du haut, avec une largeur de 289 pixels et une hauteur de 80 pixels.

Il est pratique d'utiliser la division entière de i par 3 pour positionner les boutons sur 3 colonnes comme sur un pavé numérique, en fonction de leur index i :

i/3 donne le n° de la rangée et i%3 celui de la colonne.

On multiplie par 97 pour trouver la position du bouton (95 pixels de largeur / hauteur +2 pixels de marge). On ajoute le décalage nécessaire pour que la première rangée soit 2 pixels en dessous du JTextField, et la première colonne à 2 pixels du bord gauche. Donc :

clavier[i].setBounds(2+97*(i%3), 84+(i/3)*97, 95, 95);

Les composants ne se redimensionnant pas lorsque la fenêtre est redimensionnée, il est préférable de rendre la fenêtre non redimensionnable (setResizable(false);) afin de ne pas voir apparaître des espaces vides.
Les dimensions de la fenêtre ont été ajustées pour parfaire le résultat. Comme les dimensions optimales dépendent, en plus de la taille du contenu, de la taille des bordures et de la barre de titre, les dimensions choisies ne seront pas forcément les meilleures pour toutes les versions de Java et tous les systèmes.
C'est un défaut du positionnement absolu qui va à l'encontre du but dans lequel Java a été initialement été conçu, que les programmes Java puissent être exécutés sans modification sous divers systèmes d'exploitation. C'est pourquoi le positionnement absolu est à priori déconseillé - mais il peut sans problème être utilisé pour des programmes à déploiement limité comme ceux écrits en ISN .
Pour éviter les problèmes liés au dimensionnement absolu, et pour s'éviter de calculer les positions ou tailles de tous les composants , le dimensionnement et la mise en place des composants peuvent (et doivent de préférence) être effectués à l'aide de layout managers.

 
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é