Académique Documents
Professionnel Documents
Culture Documents
Cours Java SWING
Cours Java SWING
Homme-Machine (IHM)
Les interfaces homme-machine et le langage Java
1. Introduction
-L'interface homme-machine,
- interaction humain-machine (IHM),
- intégration hommes système (IHS) ou
- interface personne-machine (IPM)
Définit, les moyens et outils mis en œuvre, afin qu'un humain puisse contrôler et
communiquer avec une machine.
Les ingénieurs en ce domaine cherche à concevoir des systèmes qui soient:
• Ergonomiques,
• Efficaces,
• Faciles à utiliser ou
• plus généralement adaptés à leur contexte d'utilisation. 2
1. Introduction
Swing
• Composants légers,
• Offre la possibilité de créer des interfaces graphiques identiques quel que soit le système
d'exploitation
• Fournit les classes pour la représentation des différents éléments d’interfaces
graphiques: fenêtres, boutons, menus, etc., et la gestion des événements.
Exemple
Exemples:
Ce groupe comprend: les cadres (JFrame), les dialogues (JDialog), les applets (JApplet) et
la fenêtre la plus basique (Jwindow)
Un conteneur de premier niveau peut contenir des objets d'une des sous-classes de
Jcomponent, mais n'est pas destiné à être contenu dans un autre conteneur de premier
niveau.
Exemple 2: JDialog
JDialog fenetre = new JDialog();
► On crée une nouvelle instance de notre JDialog
fenetre.setTitle(”Première fenêtre Swing”);
► On lui donne un titre
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
► On dit à l'application de se fermer lors du clic sur la croix
Exemple 3: JWindow
JWindow fenetre = new JWindow();
► On crée une nouvelle instance de notre JWindow
fenetre.setSize(200, 300);
► On lui donne une taille pour qu'on puisse la voir
fenetre.setVisible(true);
► On la rend visible
Chapitre 1: Les interfaces homme-machine et le langage Java 11.
3.1 Les conteneurs de premier niveau : Création d’une JFrame
import javax.swing.*;
class Fenetre {
La fermeture d’une fenêtre de type JFrame ne met pas fin au programme, mais rend
simplement la fenêtre invisible :
window.setVisible(false); //On la rend invisible
import javax.swing.*;
public class TestJFrame3 {
public static void main(String argv[]) {
JFrame fenetre = new JFrame("ma fenetre");
fenetre.setSize(300,200);
fenetre.setDefaultCloseOperation(WindowConstant
s.DO_NOTHING_ON_CLOSE);
fenetre.setVisible(true);
}
}
Les classes du toolkit de AWT (Abstract Windows Toolkit) permettent d'écrire des interfaces
graphiques indépendantes du système d'exploitation sur lesquels elles vont fonctionner.
Le toolkit contient des classes décrivant les composants graphiques, les polices, les couleurs
et les images.
import javax.swing.*;
import java.awt.*;
public class TestJFrame5 {
fenetre.setLocation(dim.width/2 - fenetre.getWidth()/2,
dim.height/2 - fenetre.getHeight()/2);
fenetre.setVisible(true);
}
}
La classe JDialog permet de créer des boîtes de dialogue, qui permettent des interaction
avec l'utilisateur de l'application.
JDialog (Dialog owner, Construit une boîte de dialogue dépendant de owner, avec un
String titre , boolean modal) titre, et une modalité
JDialog (Frame owner, Construit une boîte de dialogue dépendant de owner, avec un
String titre) titre, et non modale
JDialog (Frame owner, Construit une boîte de dialogue dépendant de owner, avec un
String titre, boolean modal) titre, et une modalité
Dialogue d’information
Exemple :
import javax.swing.*;
import java.awt.*;
Dialogue de confirmation
La valeur retournée par l’appel de méthode est l’une des trois suivantes :
OK_OPTION
NO_OPTION
CANCEL_OPTION
Dialogue de confirmation
Exemple :
import javax.swing.*;
import java.awt.*;
Comme les conteneurs de premier niveau, les conteneurs intermédiaires sont destinés à
contenir des objets d'une sous-classe de JComponent.
Les conteneurs intermédiaires sont utilisés pour structurer les interfaces graphiques.
Quelques méthodes :
Les panneaux (JPanel) sont les conteneurs intermédiaires les plus simples.
Il est possible de placer les panneaux dans d'autres conteneurs, qu'ils soient de premier
niveau ou intermédiaires.
Exemple:
JPanel Panneau = new JPanel(); // On crée une nouvelle instance de notre
JPanel
fenetre.getContentPane().add( Panneau );//on ajoute le panneau à la fenêtre
import java.awt.Color;
import javax.swing.*;
public class TestJPanel
{
public static void main(String args [])
{
JFrame fenetre = new JFrame("Une fenetre JFrame avec panneau");
fenetre.setSize(300,100);
JPanel Panneau = new JPanel();
fenetre.getContentPane().add(Panneau);
Panneau.setBackground(Color.green ) ;
JLabel label = new JLabel("Bonjour à tous!");
Panneau.add(label );
fenetre.setVisible(true);
}
}
En swing un bouton peut comporter du texte, et/ou une icône ou un en ensemble d'icônes
destinées à représenter les différents états du bouton :
₋ activé ou désactivé : définit si l'utilisateur peut cliquer dessus ;
₋ pressé/sélectionné ou relâché/non sélectionné
La classe JButton permet de définir des boutons sur lesquels on peut cliquer.
Exemple:
import javax.swing.*;
public class TestJPanel
{
public static void main(String args [])
{
JFrame fenetre = new JFrame( "Une fenetre JFrame avec panneau" );
fenetre.setSize(300,100);
Indication:
GridLayout grid=new GridLayout(5, 4); //On définit le layout à utiliser sur le content
pane 5 lignes sur 4 colonnes
Panneau.setLayout(grid);
Solution:
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.*;
public class TestJPanel
{
public static void main(String args [])
{String[] buttons = {"C“, "Bck", "", "close","7","8","9", "/", "4",
"5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+"};
JFrame fenetre = new JFrame( "Calculatrice" );
fenetre.setSize(350,300);
fenetre.setVisible(true);
}
}
Chapitre 1: Les interfaces homme-machine et le langage Java 33.
5 Les composants atomiques: JCheckBox
JCheckBox permet de définir des cases à cocher, qui peuvent être sélectionnées ou non.
Les constructeurs de JCheckBox sont les suivants :
Constructeur Rôle
JCheckBox(String) précise l'intitulé
JCheckBox(String, boolean) précise l'intitulé et l'état
JCheckBox(Icon) spécifie l'icône utilisée
JCheckBox(Icon, boolean) précise l'intitulé et l'état du bouton
JCheckBox(String, Icon) précise l'intitulé et l'icône
JCheckBox(String, Icon,
précise l'intitulé, une icône et l'état
boolean)
Exemple:
Exercice: Créer une fenêtre avec un panneau et deux cases à cocher de type JCheckBox.
import javax.swing.*;
Il faut ajouter tous les JRadioButton du groupe en utilisant la méthode add() de la classe
ButtonGroup.
ButtonGroup group = new ButtonGroup();
JRadioButton radio1 = new JRadioButton(“Bouton 1", true);
JRadioButton radio2 = new JRadioButton(" Bouton 2");
group.add(radio1);
group.add(radio2);
panel.add(radio1);
panel.add(radio2);
Lors de la sélection d'un bouton, c'est l'objet de type ButtonGroup qui se charge de
désélectionner le bouton précédemment sélectionné dans le groupe.
Un groupe n'a pas l'obligation d'avoir un bouton sélectionné.
La classe JRadioButton possède plusieurs constructeurs :
Constructeur Rôle
JRadioButton() Créer un bouton non sélectionné sans libellé
Créer un bouton non sélectionné sans libellé avec l'icône fournie en
JRadioButton(Icon)
paramètre
JRadioButton(Icon, Créer un bouton sans libellé avec l'icône et l'état fournis en
boolean) paramètres
JRadioButton(String) Créer un bouton non sélectionné avec le libellé fourni en paramètre
JRadioButton(String,
boolean)
Créer un bouton avec le libellé et l'état fournis en paramètres
JRadioButton(String, Créer un bouton non sélectionné avec le libellé et l'icône fournis en
Icon) paramètres
JRadioButton(String,
Icon, boolean)
Créer un bouton avec le libellé, l'icône et l'état fournis en paramètres
Lorsque l’on saisit du texte dans un tel composant celui-ci adapte sa taille au texte saisi au
fur et à mesure. Ce comportement n’est pas toujours souhaitable, on peut l’éviter en lui
définissant une taille préférentielle par sa méthode setPreferredSize et une taille minimale
par sa méthode SetMinimumSize
Exemple:
Exercice: Écrire un programme qui permet à l’utilisateur de saisir des caractères dans un champ
texte.
import java.awt.FlowLayout;
import javax.swing.*;
public class TestJTextField extends JFrame{
public TestJTextField(){
setTitle("Une fenetre avec zone de texte");
setSize(200,200);
setLayout(new FlowLayout());
JPanel panneau = new JPanel();
JLabel label1 = new JLabel("Nom:" );
JLabel label2 = new JLabel("prénom:" );
JTextField texte1=new JTextField (10);
JTextField texte2=new JTextField (10);
add(panneau);
add(label1);add(texte1);
add(label2);add(texte2);
setVisible(true);
}
public static void main(String[] args){
new TestJTextField();
}
} Chapitre 1: Les interfaces homme-machine et le langage Java 42.
5 Les composants atomiques: JList
La classe JList permet d'afficher une liste d'objets, et offre à l'utilisateur la possibilité de
Un JList peut être créé à partir d'un tableau d'objets, ou à partir d'un Vector, mais si on
veut une liste qui peut être mise à jour par programme, il faut utiliser un ListModel.
Constructeur Rôle
JList() Crée un JList vide.
JList(Object [] donnees)
Crée un JList qui affiche les données contenues dans le
tableau donnees.
JList(Vector v)
Crée un JList qui affiche les données contenues dans le
vecteur v.
JList (ListModel l)
Crée un JList qui affiche les données contenues dans
le ListModel l.
Chapitre 1: Les interfaces homme-machine et le langage Java 43.
5 Les composants atomiques: JList
Quelques méthodes de JList :
Méthode Rôle
int getSelectionMode() Retourne le mode de sélection des données.
void setSelectionMode( int sm) Affecte le mode de sélection des données.
int[] getSelectedIncices() Retourne les indices des items sélectionnés.
void setSelectedIndex(int i) Affecte l'indice de l'item sélectionné.
void setSelectedIndices(int [] i) Affecte les indices des items sélectionnés.
Object getSelectedValue() Retourne la valeur de l'item sélectionné.
Object[] getSelectedValues() Retourne un tableau des items sélectionnés.
Retourne le modèle de données affiché par
ListModel getModel()
le JList.
Le nouveau modèle de données affiché par
void setModel(ListModel lm)
le JList est lm.
ListCellRenderer getCellRenderer() Retourne l'objet qui gère le rendu des items.
Exemple:
Exercice: Créer une fenêtre avec un panneau et la liste des choix suivante.
import javax.swing.*;
public class TestJList {
fenetre.add(panneau);
fenetre.setVisible(true);
}
} Chapitre 1: Les interfaces homme-machine et le langage Java 46.
5 Les composants atomiques: JMenuBar
Exemple:
JMenuBar BarreDeMenus=new JMenuBar(); // On crée une nouvelle instance de notre
JMenuBar
JMenu menu = new JMenu("Menu"); // On crée une nouvelle instance de notre
JMenu
BarreDeMenus.add(menu);// On ajoute JMenu à la JMenuBar
import java.awt.Color;
import javax.swing.*;
public class CreationDunBarreDeMenus {
public static void main(final String
args[]) {
JFrame fenetre = new
JFrame("Exemple d'une barre de JMenuItem menuItem3 = new
Menus"); JMenuItem("Enregistrer");
fenetre.setSize(350, 250); Menu1.add(menuItem3);
JMenuItem menuItem4 = new
fenetre.getContentPane().setBackground JMenuItem("Quitter");
(Color.WHITE); Menu1.add(menuItem4);
JMenuBar BarreDeMenus = new JMenu Menu2 = new
JMenuBar(); JMenu("Edition");
JMenu Menu1 = new BarreDeMenus.add(Menu1);
JMenu("Fichier"); JMenu Menu3 = new JMenu("Aide ?");
BarreDeMenus.add(Menu1); BarreDeMenus.add(Menu1);
JMenuItem menuItem1 = new BarreDeMenus.add(Menu2);
JMenuItem("Nouveau"); BarreDeMenus.add(Menu3);
Menu1.add(menuItem1); fenetre.setJMenuBar(BarreDeMenus);
JMenuItem menuItem2 = new fenetre.setVisible(true);
JMenuItem("Ouvrir"); }
Menu1.add(menuItem2); }
50
1 Layout manager : FlowLayout
Le gestionnaire FlowLayout (mise en page flot) place les composants ligne par ligne de
gauche à droite.
Chaque ligne est complétée progressivement jusqu'à être remplie, puis passe à la suivante.
Chaque ligne est centrée par défaut. C'est la mise en page par défaut des applets.
Il existe plusieurs constructeurs :
Constructeur Rôle
FlowLayout( );
Permet de préciser l'alignement des composants dans le
FlowLayout( int align); conteneur (CENTER, LEFT, RIGHT ... ). Par défaut, align vaut
CENTER
FlowLayout( int align, Permet de préciser l'alignement et l'espacement horizontal et
int hgap, int vgap); vertical dont la valeur par défaut est 5.
Exemple:
JFrame fenetre = new JFrame(« Ma fenêtre");
fenetre.getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER));
La disposition des composants est commandée par une mise en page en bordure qui
découpe la surface en cinq zones : North, South, East, West, Center.
On peut librement utiliser une ou plusieurs zones.
Il existe plusieurs constructeurs :
Constructeur Rôle
BorderLayout( )
BorderLayout (int hgap,int Permet de préciser l'espacement horizontal
vgap) et vertical des composants.
Exemple:
setLayout(new BorderLayout());
add("North", new Button(" bouton haut "));
import java.awt.*;
import javax.swing.*;
public class TestBorderLayout extends JFrame {
public TestBorderLayout() {
super();
setTitle("Test BorderLayout");
setSize(300, 200);
setLayout(new BorderLayout());
add("North", new Button(" bouton haut "));
add("South", new Button(" bouton bas "));
add("West", new Button(" bouton gauche "));
add("East", new Button(" bouton droite "));
add("Center", new Button(" bouton milieu "));
pack();
setVisible(true);
}
public static void main(String[] args) {
new TestBorderLayout();
}
}
Chapitre 2: Le positionnement des composants. 54.
3 Layout manager : GridLayout
Ce gestionnaire établit un réseau de cellules identiques qui forment une sorte de quadrillage
invisible : les composants sont organisés en lignes et en colonnes.
Les éléments insérés dans la grille ont tous la même taille.
Les cellules du quadrillage se remplissent de gauche à droite ou de haut en bas.
Il existe plusieurs constructeurs :
Constructeur Rôle
Les deux premiers entiers spécifient le nombre de
GridLayout( int, int );
lignes ou de colonnes de la grille.
GridLayout( int, int, int, permet de préciser en plus l'espacement horizontal
int ); et vertical des composants.
Exemple:
setLayout(new GridLayout(1,2));
add(new Button("bouton 1"));
add(new Button("bouton 2"));
Constructeur Rôle
Les deux premiers entiers spécifient le nombre de
GridLayout( int, int );
lignes ou de colonnes de la grille.
GridLayout( int, int, int, permet de préciser en plus l'espacement horizontal
int ); et vertical des composants.
Exemple:
setLayout(new GridLayout(1,2));
add(new Button("bouton 1"));
add(new Button("bouton 2"));
import java.awt.*;
import javax.swing.JFrame;
public class TestGridLayout extends JFrame {
public TestGridLayout() {
setTitle(" Test GridLayout ");
setSize(300, 150);
setLayout(new GridLayout(2, 3));
add(new Button("bouton 1"));
add(new Button("bouton 2"));
add(new Button("bouton 3"));
add(new Button("bouton 4"));
add(new Button("bouton 5 tres long"));
add(new Button("bouton 6"));
setVisible(true);
}
public static void main(String[] args) {
new TestGridLayout();
}
}
N'importe quelle interface graphique doit interagir avec l'utilisateur et donc réagir à certains
événements.
Les événements utilisateurs sont gérés par plusieurs interfaces EventListener.
Les interfaces EventListener permettent de définir les traitements en réponse à des
événements utilisateurs généré par un composant.
Une classe doit contenir une interface auditrice pour chaque type d'événements à traiter :
₋ ActionListener : clic de souris ou enfoncement de la touche Enter
₋ ItemListener : utilisation d'une liste ou d'une case à cocher
₋ MouseMotionListener : événement de souris
₋ WindowListener : événement de fenêtre
58
1 Introduction
Les événements sémantiques
Dans la dernière colonne de ce tableau, les termes génériques Boutons et Menus désignent les
classes suivantes
• Boutons : JButton, JCheckBox, JRadioButton,
• Menus : JMenu, JMenuItem, JCheckBoxMenuItem, JRadioButtonMenuItem.
Pour déclarer plusieurs interfaces, il suffit de les séparer par des virgules.
public class TestListner extends JFrame implements
ActionListener, , MouseListener {
2) Appel à la méthode addXXX() pour enregistrer l'objet qui gérera les événements XXX du
composant.
Il faut configurer le composant pour qu'il possède un «écouteur» pour l'événement
utilisateur concerné.
Chaque auditeur possède des méthodes différentes qui sont appelées pour traiter
leurs événements.