Interfaces Graphiques - Master 1
Travaux pratiques n°3

Auteurs: Vincent Padovani, Jean-Baptiste Yunès

But du TP

L'objectif de cette séance est de réaliser une mini-calculatrice afin d'expérimenter (entre autres) la gestion d'un JTextField, l'utilisation du gestionnaire de positions GridBagLayout (flexible mais complexe, et peu et mal documenté), ainsi que la définition et l'implémentation d'un automate simple (le mécanisme interne de la calculette). La calculette doit être munie au minimum des 4 opérations arithmétiques standard. Idéalement, elle doit pouvoir travailler avec des nombres entiers et des nombres à virgule, et calculer une racine carée.

Ce TP est prévu pour durer deux séances. Commencez par écrire l'interface de la calculette. L'implémentation de son mécanisme interne est un casse-tête demandant un peu de réflexion par écrit.

Définitions des classes

Le panneau de la calculette sera représenté par une nouvelle classe Calculette, extension de JPanel.

Il vous faudra probablement définir des sous-classes de la classe Bouton, extension de JButton, pour distinguer les différents types de boutons  les boutons pour les chiffres, les boutons des opérateurs et peut-être les boutons spéciaux (pour effacer, etc).

Création de l'interface

L'interface sera constituée d'un champ de saisie texte de classe JTextField, et d'un clavier formé de boutons de classe Bouton définie comme ci-dessus. Ces éléments seront encapsulés dans le panneau de la calculatrice, lui-même encapsulé dans la fenêtre principale. Ce panneau sera muni du gestionnaire de positions GridBagLayout. Les ajouts des composants internes se feront à l'aide d'un spécificateur de contraintes de classe GridBagConstraints (c.f. le tutorial ). La fenêtre principale devra pouvoir être redimensionnée avec un ajustement uniforme de la taille de tous ses composants internes.

Vous pouvez chercher à obtenir l'une ou l'autre des dispositions ci-dessous. Dans la première, le panneau contient 4 colonnes, et chaque bouton s'étale sur 1 ou 2 colonnes. Dans la seconde, la dernière ligne contient 8 boites invisibles renvoyées par Box.createRigidArea(Dimension d) avec une dimension nulle de manière à garantir l'existence de 8 colonnes, et chaque bouton s'étale sur 2 ou 3 colonnes


Gestion des événements

La calculette devra se comporter comme une calculette ordinaire. Les événements ActionEvent générés par les boutons seront reçus par autant d'écouteurs qu'il y a de types de boutons (3 si on suit la description située plus haut). Les écouteurs implémentent, évidemment l'interface ActionListener. Pour un bouton portant un chiffre, il suffit d'ajouter le caractère porté par le bouton (le chiffre) à la fin du JTextField. Pour un bouton d'opérateur, il doit agir sur deux valeurs : une valeur précédemment saisie et stockée quelque part et la valeur courante affichée dans le JTextField.

Il est conseillé de chercher d'abord sur papier l'automate associé au mécanisme interne. Voici quelques indications :

Une alternative serait d'utiliser la «polonaise inversée» (pour les intimes c'est une notation postfixée, pour les «rookies» en infixe on écrit a + b et en postfixe a b +).