Utilisation de boutons à cocher
Notre application prend différents aspects :
ou avec une applet (que vous pouvez essayer ci-dessous) :
alt : l'applet n'est pas visible par votre
navigateur (dans le menu Outils, Modules complémentaires,
activer le plugin Java(TM) Platform SE 6 U32 6.0.320.5 s'il est
désactivé)
Dans l'application (ou dans l'applet), il y a deux sortes de
boutons à cocher :
les boutons de nom petit , moyen
et grand sont regroupés dans un
ensemble, comme vous le verrez dans le programme, et cela
entraîne qu'on peut cocher qu'un seul de ces boutons. Ces
boutons sont des instances de la classe javax.swing.JRadioButton .
On les appelle des boutons-radios.
les boutons de nom monde et tour
sont isolés : ils peuvent être cochés
indépendamment. Ces boutons sont des instances de la classe javax.swing.JCheckBox .
Dans l'application :
le bouton de nom monde est
représenté par une petite îcone.
le groupe de boutons-radios correspondant à
trois tailles est entouré d'une ligne verte obtenue en
utilisant la classe BorderFactory .
le groupe des deux autres boutons est entouré
d'une ligne rouge.
l'ensemble des boutons est dans une zone en "relief creux"
obtenue en utilisant encore la classe BorderFactory .
Le programme utilise la classe ArdoiseMonde
qui modélise la partie gauche de l'application, celle
où on voir le disque ou le monde, entouré ou pas.
Elle ne présente pas de difficulté ni de
nouveauté, nous vous la laissons découvrir sous
le lien. Il y a quelques lignes qui concernent le chargement d'une
image, sujet qui fait l'objet d'une autre section et dont vous pouvez
repousser l'étude.
import javax.swing.Box;import javax.swing.JFrame;import javax.swing.JCheckBox;import javax.swing.JRadioButton;import javax.swing.BorderFactory;import javax.swing.ButtonGroup;import javax.swing.ImageIcon;import java.awt.Dimension;import java.awt.Image;import java.awt.Graphics;import java.awt.Color;import java.awt.BorderLayout;import java.awt.event.ItemListener;import java.awt.event.ItemEvent;class ListenerTaille implements ItemListener { int taille; ArdoiseMonde ardoise; ListenerTaille(int taille, ArdoiseMonde ardoise) { this .taille = taille; this .ardoise = ardoise; } public void itemStateChanged(ItemEvent evt) { ardoise.setRayon(taille); ardoise.repaint(); } }public class FenetreCocher extends JFrame { ArdoiseMonde ardoise = new ArdoiseMonde(); JRadioButton petit = new JRadioButton("petit", true ); JRadioButton moyen = new JRadioButton("moyen", false ); JRadioButton grand = new JRadioButton("grand", false ); JCheckBox monde; JCheckBox tour = new JCheckBox("entoure", false ); ImageIcon icone; public FenetreCocher() { ButtonGroup groupe = new ButtonGroup(); Box panneauRadio = Box.createVerticalBox(); Box panneauCocher = Box.createVerticalBox(); Box panneauChoix = Box.createVerticalBox();icone = new ImageIcon(ardoise.getImage().getScaledInstance (10, 10, Image.SCALE_DEFAULT)); monde = new JCheckBox( "monde", icone); petit.addItemListener(new ListenerTaille(ArdoiseMonde.PETIT, ardoise)); moyen.addItemListener(new ListenerTaille(ArdoiseMonde.MOYEN, ardoise)); grand.addItemListener(new ListenerTaille(ArdoiseMonde.GRAND, ardoise)); tour.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent evt) { ardoise.inverserEntourer(); ardoise.repaint(); } }); monde.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent evt) { ardoise.inverserFaireMonde(); ardoise.repaint(); } }); groupe.add(petit); groupe.add(moyen); groupe.add(grand); panneauRadio.add(petit); panneauRadio.add(moyen); panneauRadio.add(grand);panneauRadio.setBorder(BorderFactory.createLineBorder(Color.GREEN)); panneauCocher.add(monde); panneauCocher.add(tour);panneauCocher.setBorder(BorderFactory.createLineBorder(Color.RED)); panneauChoix.add(panneauRadio, BorderLayout.NORTH); panneauChoix.add(panneauCocher, BorderLayout.SOUTH); panneauChoix.setBorder(BorderFactory.createLoweredBevelBorder()); add(ardoise, BorderLayout.CENTER); add(panneauChoix, BorderLayout.EAST); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setVisible(true ); } } class EssaiCocher { public static void main(String[] arg) { new FenetreCocher(); } }
Vous pouvez voir ici le fichier FenetreCocher.java
ainsi que Ardoise.java
et l'image du monde .
Et si vous voulez voir le
code de l'applet ...
ItemListener :
l'interface java.awt.event.ItemListener contient
la déclaration de la méthode itemStateChanged .
Elle permet, en l'implémentant, de définir des
listenerss pour les boutons à cocher et pour
différents types de listes proposant des choix entre
différents items.JRadioButton petit =
new
JRadioButton("petit", true); : ce constructeur
donne en premier paramètre le nom du bouton et en second
paramètre une valeur booléenne indiquant si le
bouton doit apparaître coché (valeur true )
ou non coché (valeur false ).
ButtonGroup
: la classe javax.Swing.ButtonGroup est
destinée à contenir plusieurs boutons. Un et un
seul de ses boutons sera sélectionné
simultanément. Lorsque l'utilisateur sélectionne
un des boutonss, l'instance de ButtonGroup
regroupant les boutons s'occupe de changer l'état des autres
boutons. La bouton sélectionné à
l'initialisation peut être précisé
comme dans notre programme à la création du
groupe. On utilisera souvent cette classe pour des boutons-radios comme
ici. Néanmoins, il n'est pas indispensable de mettre les
boutons dans un ButtonGroup .
Box
panneauRadio = Box.createVerticalBox(); : la
classe javax.swing.Box modélise un
composant léger, du même genre qu'un JPanel ,
mais il est muni d'un gestionnaire
de répartition de type BoxLayout
; un tel gestionnaire permet, selon le choix d'un attribut, de mettre
les sous-composants les uns en-dessous des autres ou les uns
à côté des autres, de telle sorte
qu'ils remplissent si possible tout l'espace disponible. Les
méthodes d'instances de la classe Box
telles que createVerticalGlue , createHorizontalGlue ,
createVerticalStrut ou
createHorizontalStrut permettent de la souplesse dans
l'ajout des sous-composants et méritent d'être
connues (voir la documentation de l'API), On utilise ici la
méthode statique createVerticalBox de
la classe Box qui crée une instance de
la classe Box destinée à
mettre les sous-composants les uns en-dessous des autres.
new
ImageIcon(ardoise.image.getScaledInstance (10, 10,
Image.SCALE_DEFAULT)); : on demande ici de
construire une instance de la classe ImageIcon
qui aura pour dessin une réduction de l'image "image "
de l'ardoise. Cette image sera de 10 pixels sur 10 pixels.
petit.addItemListener(new
ListenerTaille(ArdoiseMonde.PETIT, ardoise));
: cette instruction indique, que lorsqu'il y aura un changement sur le
choix avec le bouton petit , la méthode
ItemStateChanged de new
ListenerTaille(ArdoiseMonde.PETIT, ardoise) sera
invoquée.
groupe.add(petit);
: on ajoute ainsi le bouton petit à
l'instance groupe de la classe ButtonGroup .
panneauRadio.setBorder(BorderFactory.createLineBorder(Color.GREEN));
: l'ensemble les boutons donnant la taille du dessin sera
entouré d'une ligne verte. La classe javax.swing.BorderFactory
contient beaucoup de méthodes statiques pour tracer des
bords à des composants graphiques ou pour leur donner un
effet de relief.
panneauChoix.setBorder(BorderFactory.createLoweredBevelBorder());
: le "panneauChoix " sera en relief "creux".
public
void
itemStateChanged(ItemEvent evt) : cette
méthode doit
être définie parce que notre classe
implémente l'interface ItemListener .
C'est cette méthode qui sera invoquée lorsqu'un
des boutons sera coché parce que nos boutons ont cet "ItemListener "
comme "listener ".
© Charon Irène, ENST - Paris 2010