Je me doute bien que vous devez être impatients de faire vos propres boîtes de dialogue...
Il est vrai que dans certains cas, vous en aurez besoin, donc allons-y gaiement !
Je vais maintenant vous révéler un secret bien gardé : les boîtes de dialogue héritent de la classe
JDialog.
Vous avez donc deviné que nous allons créer une classe dérivée de cette dernière.
Commençons par faire un nouveau projet.
Créez une nouvelle classe dans Eclipse, appelons-la
ZDialog héritée de la classe citée ci-dessus, et mettez-y le code suivant :
Code : Java 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | import javax.swing.JDialog;
import javax.swing.JFrame;
public class ZDialog extends JDialog {
public ZDialog(JFrame parent, String title, boolean modal){
//On appelle le construteur de JDialog correspondant
super(parent, title, modal);
//On spécifie une taille
this.setSize(200, 80);
//La position
this.setLocationRelativeTo(null);
//La boîte ne devra pas être redimensionnable
this.setResizable(false);
//Enfin on l'affiche
this.setVisible(true);
//Tout ceci ressemble à ce que nous faisons depuis le début avec notre JFrame...
}
}
|
Maintenant, faisons une classe qui va tester notre
ZDialog :
Code : Java 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 | import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Fenetre extends JFrame {
private JButton bouton = new JButton("Appel à la ZDialog");
public Fenetre(){
this.setTitle("Ma JFrame");
this.setSize(300, 100);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.getContentPane().setLayout(new FlowLayout());
this.getContentPane().add(bouton);
bouton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
ZDialog zd = new ZDialog(null, "Coucou les ZérOs", true);
}
});
this.setVisible(true);
}
public static void main(String[] main){
Fenetre fen = new Fenetre();
}
}
|
Voilà le résultat ; bon, c'est un début :
Je pense que vous avez deviné à quoi servaient les paramètres du constructeur... Mais nous allons tout de même les expliciter :
- JFrame Parent correspond à l'objet parent ;
- String title correspond au titre de notre boîte ;
- boolean modal correspond à la modalité. true : boîte modale, false : boîte non modale.
Rien de compliqué... Il est donc temps de mettre des composants sur notre objet...
Par contre, vous conviendrez que lorsque nous faisons un tel composant, nous voulons quelque chose de plus qu'une réponse à une question ouverte (oui / non), une chaîne de caractères ou encore un choix dans une liste... Nous en voulons encore plus ! Plusieurs saisies, avec plusieurs listes :
en même temps !
Mais vous avez vu que nous devrons récupérer les informations choisies dans certains cas, mais pas tous : nous allons donc devoir déterminer les différents cas ainsi que les choses à faire.
Nous partons du fait que notre boîte aura un bouton "
OK" et "
Annuler" : dans le cas où l'utilisateur clique sur "
OK", on récupérera les informations, et si l'utilisateur clique sur "
Annuler", non.
Tout ceci en tenant compte de la modalité de notre boîte...
D'ailleurs, comment va-t-on faire pour dire à notre boîte de mettre fin au dialogue ?
Tout simplement en utilisant la méthode
setVisible(false);, cette instruction met fin au dialogue !
Ceci signifie aussi que le dialogue commence au moment où l'instruction
setVisible(true); est exécutée. De ce fait, nous allons sortir cette instruction du constructeur de notre objet et nous allons la mettre dans une méthode à part.
Code : Java | //Cas où notre ZDialog renverra le contenu
//D'un JTextField nommé jtf
public String showZDialog(){
this.setVisible(true);
//Le dialogue prend fin
//SI on a cliqué sur OK, on envoie, sinon on envoie chaîne vide !
return jtf.getText();
}
|
Il nous reste un dernier point à gérer...
Comment récupérer les informations saisies dans notre boîte depuis notre fenêtre, vu que nous voulons plusieurs informations ?
C'est vrai qu'on ne peut retourner qu'une valeur à la fois...

Mais il peut y avoir plusieurs réponses à cette question.
- Dans le cas où nous n'avons qu'un composant, nous pouvons adapter la méthode showZDialog() au type de retour du composant utilisé.
- Dans notre cas, nous voulons plusieurs composants, donc plusieurs valeurs, vous pouvez :
- retourner une collection de valeurs (ArrayList...) ;
- faire des accesseurs dans votre ZDialog ;
- créer un objet dont le rôle est de collecter les informations de votre boîte et de retourner cet objet...
- ...
Nous allons opter pour un objet qui collectera les informations et nous retournerons cet objet à la fin de la méthode
showZDialog().
Avant de nous lancer dans la création de cet objet, nous devons savoir ce que nous allons mettre dans notre boîte...
Nous allons faire une boîte permettant de spécifier les caractéristiques d'un personnage de jeu vidéo :
- son nom : un champ de saisie ;
- son sexe : une combo ;
- sa taille : un champ de saisie ;
- sa couleur de cheveux : une combo ;
- sa tranche d'âge : des radios.
Pour le placement des composants, l'objet JDialog est exactement identique à un objet JFrame (BorderLayout par défaut, ajout de composant au conteneur...).
Nous pouvons donc faire notre objet contenant les informations de notre boîte de dialogue, je l'ai appelé
ZDialogInfo :
Code : Java 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 | public class ZDialogInfo {
private String nom, sexe, age, cheveux, taille;
public ZDialogInfo(){}
public ZDialogInfo(String nom, String sexe, String age,
String cheveux, String taille){
this.nom = nom;
this.sexe = sexe;
this.age = age;
this.cheveux = cheveux;
this.taille = taille;
}
//------------------------------------
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
//------------------------------------
public String getSexe() {
return sexe;
}
public void setSexe(String sexe) {
this.sexe = sexe;
}
//------------------------------------
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
//------------------------------------
public String getCheveux() {
return cheveux;
}
public void setCheveux(String cheveux) {
this.cheveux = cheveux;
}
//------------------------------------
public String getTaille() {
return taille;
}
public void setTaille(String taille) {
this.taille = taille;
}
//-------------------------------------
public String toString(){
String str;
if(this.nom != null && this.sexe != null &&
this.taille != null && this.age != null &&
this.cheveux != null){
str = "Description de l'objet InfoZDialog";
str += "Nom : " + this.nom + "\n";
str += "Sexe : " + this.sexe + "\n";
str += "Age : " + this.age + "\n";
str += "Cheveux : " + this.cheveux + "\n";
str += "Taille : " + this.taille + "\n";
}
else{
str = "Aucune information !";
}
return str;
}
}
|
L'avantage avec cette méthode, c'est que nous n'avons pas à nous soucier de savoir si nous avons annulé la saisie ou non : l'objet d'information renverra toujours quelque chose...
Voici le code source de notre boîte perso :
Code : Java 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177 | import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.ButtonGroup;
import javax.swing.JTextField;
public class ZDialog extends JDialog {
private ZDialogInfo zInfo = new ZDialogInfo();
private JLabel nomLabel, sexeLabel, cheveuxLabel, ageLabel, tailleLabel, taille2Label, icon;
private JRadioButton tranche1, tranche2, tranche3, tranche4;
private JComboBox sexe, cheveux;
private JTextField nom, taille;
/**
* Constructeur
* @param parent
* @param title
* @param modal
*/
public ZDialog(JFrame parent, String title, boolean modal){
super(parent, title, modal);
this.setSize(550, 270);
this.setLocationRelativeTo(null);
this.setResizable(false);
this.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
this.initComponent();
}
/**
* Méthode appelée pour utiliser la boîte
* @return zInfo
*/
public ZDialogInfo showZDialog(){
this.setVisible(true);
return this.zInfo;
}
/**
* Initialise le contenu de la boîte
*/
private void initComponent(){
//Icone
icon = new JLabel(new ImageIcon("images/icone.jpg"));
JPanel panIcon = new JPanel();
panIcon.setBackground(Color.white);
panIcon.setLayout(new BorderLayout());
panIcon.add(icon);
//Le nom
JPanel panNom = new JPanel();
panNom.setBackground(Color.white);
panNom.setPreferredSize(new Dimension(220, 60));
nom = new JTextField();
nom.setPreferredSize(new Dimension(100, 25));
panNom.setBorder(BorderFactory.createTitledBorder("Nom du personnage"));
nomLabel = new JLabel("Saisir un nom :");
panNom.add(nomLabel);
panNom.add(nom);
//Le sexe
JPanel panSexe = new JPanel();
panSexe.setBackground(Color.white);
panSexe.setPreferredSize(new Dimension(220, 60));
panSexe.setBorder(BorderFactory.createTitledBorder("Sexe du personnage"));
sexe = new JComboBox();
sexe.addItem("Masculin");
sexe.addItem("Féminin");
sexe.addItem("Indéterminé");
sexeLabel = new JLabel("Sexe : ");
panSexe.add(sexeLabel);
panSexe.add(sexe);
//L'âge
JPanel panAge = new JPanel();
panAge.setBackground(Color.white);
panAge.setBorder(BorderFactory.createTitledBorder("Age du personnage"));
panAge.setPreferredSize(new Dimension(440, 60));
tranche1 = new JRadioButton("15 - 25 ans");
tranche1.setSelected(true);
tranche2 = new JRadioButton("26 - 35 ans");
tranche3 = new JRadioButton("36 - 50 ans");
tranche4 = new JRadioButton("+ de 50 ans");
ButtonGroup bg = new ButtonGroup();
bg.add(tranche1);
bg.add(tranche2);
bg.add(tranche3);
bg.add(tranche4);
panAge.add(tranche1);
panAge.add(tranche2);
panAge.add(tranche3);
panAge.add(tranche4);
//La taille
JPanel panTaille = new JPanel();
panTaille.setBackground(Color.white);
panTaille.setPreferredSize(new Dimension(220, 60));
panTaille.setBorder(BorderFactory.createTitledBorder("Taille du personnage"));
tailleLabel = new JLabel("Taille : ");
taille2Label = new JLabel(" cm");
taille = new JTextField("180");
taille.setPreferredSize(new Dimension(90, 25));
panTaille.add(tailleLabel);
panTaille.add(taille);
panTaille.add(taille2Label);
//La couleur des cheveux
JPanel panCheveux = new JPanel();
panCheveux.setBackground(Color.white);
panCheveux.setPreferredSize(new Dimension(220, 60));
panCheveux.setBorder(BorderFactory.createTitledBorder("Couleur de cheveux du personnage"));
cheveux = new JComboBox();
cheveux.addItem("Blond");
cheveux.addItem("Brun");
cheveux.addItem("Roux");
cheveux.addItem("Blanc");
cheveuxLabel = new JLabel("Cheveux");
panCheveux.add(cheveuxLabel);
panCheveux.add(cheveux);
JPanel content = new JPanel();
content.setBackground(Color.white);
content.add(panNom);
content.add(panSexe);
content.add(panAge);
content.add(panTaille);
content.add(panCheveux);
JPanel control = new JPanel();
JButton okBouton = new JButton("OK");
okBouton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
zInfo = new ZDialogInfo(nom.getText(), (String)sexe.getSelectedItem(), getAge(), (String)cheveux.getSelectedItem() ,getTaille());
setVisible(false);
}
public String getAge(){
return (tranche1.isSelected()) ? tranche1.getText() : (tranche2.isSelected()) ? tranche2.getText() : (tranche3.isSelected()) ? tranche3.getText() : (tranche4.isSelected()) ? tranche4.getText() : tranche1.getText();
}
public String getTaille(){
return (taille.getText().equals("")) ? "180" : taille.getText();
}
});
JButton cancelBouton = new JButton("Annuler");
cancelBouton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
setVisible(false);
}
});
control.add(okBouton);
control.add(cancelBouton);
this.getContentPane().add(panIcon, BorderLayout.WEST);
this.getContentPane().add(content, BorderLayout.CENTER);
this.getContentPane().add(control, BorderLayout.SOUTH);
}
}
|
J'ai ajouté une image, mais vous n'y êtes nullement obligés !
Vous constaterez aussi que j'ai ajouté une bordure à nos JPanel afin de faire plus... Zoli...
Et le code source permettant de tester cette boîte :
Code : Java 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 | import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class Fenetre extends JFrame {
private JButton bouton = new JButton("Appel à la ZDialog");
public Fenetre(){
this.setTitle("Ma JFrame");
this.setSize(300, 100);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.getContentPane().setLayout(new FlowLayout());
this.getContentPane().add(bouton);
bouton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
ZDialog zd = new ZDialog(null, "Coucou les ZérOs", true);
ZDialogInfo zInfo = zd.showZDialog();
JOptionPane jop = new JOptionPane();
jop.showMessageDialog(null, zInfo.toString(), "Informations personnage", JOptionPane.INFORMATION_MESSAGE);
}
});
this.setVisible(true);
}
public static void main(String[] main){
Fenetre fen = new Fenetre();
}
}
|
Voici des screenshots obtenus
De la ZDialog
Lorsqu'on valide la saisie
Lorsqu'on annule la saisie
Voilà : nous arrivons à la fin de chapitre, riche en nouveautés...
En route pour le topo habituel et le petit QCM des familles...