On peut n'utiliser qu'une partie des positions du BorderLayout (ce qu'on va faire ici).
On commence par créer un autre JPanel (appelé haut) affecté d'un Layout Manager GridLayout à 1 seule ligne/colonne, pour y placer le JTextField. (ce n'est pas obligatoire car on pourrait positionner directement le JTextField dans la fenêtre, mais c'est préférable car les JPanel ont des propriétés intéressantes d'autodimensionnement. En utililisant un GridLayout 1 x 1 on s'assure que le JTextField remplira complètement le JPanel quoi qu'il arrive).
L'élément placé au centre est celui qui aura les plus grandes dimensions : on va donc placer le JPane haut en position PAGE_START, et le JPanel bas en position CENTER.
import javax.swing.*; import java.awt.*; class QuatreCoins extends JFrame{ JButton[] clavier=new JButton[12]; JTextField ecran; QuatreCoins(){ super(); setTitle("GridLayout + BorderLayout"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 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,BorderLayout.PAGE_START); JPanel bas=new JPanel(); bas.setLayout(new GridLayout(4,3,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,BorderLayout.CENTER); setLocation(400,400); setMinimumSize(new Dimension(210,310)); pack(); setVisible(true); } public static void main(String[] args) { new QuatreCoins(); } }Les modifications par-rapport à Base.java sont en violet.
Outre les changements déjà expliqués, on a modifié la façon dont la fenêtre est dimensionnée et positionnée :
setLocation(400,400); setMinimumSize(new Dimension(210,310)); pack();Lorsqu'on utilise des Layout Managers il n'est pas nécessaire de rendre la fenêtre non redimensionnable : la taille des composants s'ajustera automatiquement à celle de la fenêtre. On peut laisser Swing optimiser les dimensions en utilisant l'instruction pack(). Cependant dans notre cas si l'utilisateur diminue trop la taille de la fenêtre les boutons deviennent illisibles : on a donc intérêt à définir une taille minimale pour la fenêtre par setMinimumSize. On peut aussi souhaiter que la fenêtre ait de préférence une taille différente de celle déterminée par pack(); On ajouterait alors l'instruction setPreferredSize, impérativement associée à pack();.
setPreferredSize(new Dimension(250,450));