Les gestionnaires de mise en page simples vus l'année dernière sont utiles pour certaines situations, mais ils doivent souvent être combinés pour obtenir un résultat satisfaisant, ce qui dégrade les performances. Même ainsi, certaines mises en pages ne sont pas possibles.
Il existe des gestionnaires plus universels qui couvrent quasiment tous les besoins en un seul conteneur, mais leur configuration est nettement plus complexe. Nous allons en voir un exemple : GridBagLayout.
Celui-ci divise l'espace disponible en une grille invisible. Toutes les lignes n'ont pas nécessairement la même hauteur, ni toutes les colonnes la même largeur. Chaque cellule ainsi délimitée peut accueillir un composant au maximum, qui n'est pas obligé d'occuper toute la surface correspondante. Un composant peut également s'étaler sur une plage de cellules.
L'ensemble des choix de configuration qui concernent un composant sont rassemblés dans un objet de la classe GridBagConstraints. Cet objet est fourni au conteneur lors de l'ajout du composant.
JButton b = new JButton("OK"); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; // la plage de cellules commence à la première colonne gbc.gridy = 1; // la plage de cellules commence à la deuxième ligne gbc.gridwidth = 2; // la plage de cellules englobe deux colonnes gbc.gridheight = 1; // la plage de cellules englobe une seule ligne gbc.fill = GridBagConstraints.NONE; // n'occupe pas tout l'espace de la plage gbc.anchor = GridBagConstraints.CENTER; // se place au centre de la plage gbc.weightx = 1.0; // souhaite plus de largeur si possible gbc.weighty = 0.0; // n'a pas besoin de hauteur supplémentaire gbc.insets = new Insets(5, 5, 5, 5); // laisse 5 pixels de vide autour du composant conteneur.add(b, gbc);
Notez bien que le nombre et la taille des lignes et colonnes sont déterminés à partir de ces informations, et vous ne pouvez donc pas les contrôler directement. En particulier, il n'est pas possible de garantir que deux colonnes seront de largeur identique (mais vous pouvez vous appuyer sur d'autres gestionnaires pour cela).
Pour certaines interactions classiques, il existe des mises en page standard qu'il est suffisant d'imiter. Cela est même souhaitable puisque la familiarité de l'utilisateur avec ces interfaces rendra l'expérience plus intuitive.
En Java, certaines classes vous donnent accès à des fenêtres (toujours modales) dont le contenu est typique : message d'information, question et réponse, choix multiple, sélection de fichier.
Tout d'abord, la classe JOptionPane possède un grand nombre de méthodes statiques qui provoquent l'apparition d'une fenêtre. Ces méthodes sont bloquantes jusqu'à la fermeture de celle-ci, et renvoient une valeur qui reflète les actions de l'utilisateur.
String login = JOptionPane.showInputDialog("login:");
En ce qui concerne la sélection de fichiers, c'est le travail de la classe JFileChooser. Contrairement à la classe précédente, elle nécessite la création d'un objet.
Boutons. Écrivez une application dont l'apparence est la suivante :
Tous les boutons sauf celui du milieu doivent s'étirer en largeur et en hauteur. Lorsque l'on tente de fermer la fenêtre, une confirmation sera demandée par le biais de la méthode showConfirmDialog de la classe JOptionPane.
Tableau. Placez dans votre base de données les tables suivantes qui décrivent les modules du DUT :
Écrivez une application qui interroge cette base puis retranscrit ces informations sous la forme d'un tableau :
Les bordures seront obtenues en invoquant la méthode setBorder sur les composants concernés.