Les dialogues sont des conteneur de premier niveau ( comme JFrame) : ils ne sont pas contenus dans d’autres cadres, mais dépendent d’un autre cadre. Lorsqu’un cadre est fermé ( ou iconifié ) les cadres qui en dépendent sont fermés ( ou iconifiés ).
Un dialogue peut être :
·
modal : lorsqu’il est
actif toute interaction avec les autres fenêtres sont bloquées. Les dialogues
JOptionPane sont modaux
· non modal : ne bloque pas les interactions avec les autres fenêtres : pour créer un dialogue non modal, on est obligé de passer par la classe JDialog.
La classe JOptionPane fournit des façon simples de créer des dialogues élémentaires modaux en spécifiant un message, un titre, une icône, et un type de message ou un type d’option.
Si on ne spécifie pas d’icône, des icônes sont fournies par le système en fonction du type de message.
L’appel de la méthode showMessageDialog de la classe JOptionPane permet de faire apparaître des messages :
Frame getFrame() { // récupération de la frame de l'applet
Component component=this;
do{
component=component.getParent();
} while(!(component instanceof Frame));
return (Frame)component;
}
JOptionPane d = new
JOptionPane();
d.showMessageDialog( getFrame(),
"le message",
"le titre",
messageType);
Le type de message est l’une des valeurs suivantes :
·
JOptionPane.PLAIN_MESSAGE;
·
JOptionPane.ERROR_MESSAGE;
·
JOptionPane.INFORMATION_MESSAGE;
·
JOptionPane.WARNING_MESSAGE;
·
JOptionPane.QUESTION_MESSAGE;
L’appel de la méthode showConfirmDialog de la classe JOptionPane permet de faire apparaître des messages, avec demande de confirmation :
JOptionPane d = new
JOptionPane();
int retour =
d.showConfirmDialog(getFrame(),
"le message",
"le titre",
optionType);
l’option de message est l’une des valeurs suivantes :
·
JOptionPane.DEFAULT_OPTION;
·
JOptionPane.YES_NO_OPTION;
·
JOptionPane.YES_NO_CANCEL_OPTION;
·
JOptionPane.OK_CANCEL_OPTION;
La valeur retournée par l’appel de méthode est l’une des trois suivantes : OK_OPTION, NO_OPTION ou CANCEL_OPTION.
L’appel de la méthode showInputDialog de la classe JOptionPane permet de faire une saisie de chaîne de caractères :
JOptionPane d = new
JOptionPane();
String
retour = d.showInputDialog(getFrame(),
"le message\n et la suite",
"le titre",
messageType);
si retour vaut null la saisie n’est pas validée,
sinon retour vaut la chaîne tapée par l’utilisateur.
JOptionPane d = new JOptionPane();
// les textes figurant sur les
boutons
String lesTextes[]={ "bonjour", "au revoir",
"bonne nuit", "bonne année"};
int retour = // indice du bouton qui a été cliqué ou CLOSED_OPTION
d.showOptionDialog(getFrame(), "le message", "le titre",
optionType, messageType,
null, // pas d’icone
lesTextes, // les testes de boutons
lesTextes[0]); // le bouton par
défaut
if( retour!=JOptionPane.CLOSED_OPTION) … ;// un bouton cliqué
else ; // pas de bouton
cliqué
La classe JDialog permet de fabriquer des boîtes de dialogue complètement personnalisées.
Constructeurs :
JDialog
(Dialog owner) |
Construit une boîte de
dialogue dépendant de owner, non modale |
JDialog (Dialog owner,
String titre) |
Construit une boîte de
dialogue dépendant de owner, avec un titre, et non
modale |
JDialog (Dialog owner,
String titre,
boolean modal) |
Construit une boîte de
dialogue dépendant de owner, avec un titre, et une
modalité |
JDialog
(Frame owner) |
Construit une boîte de
dialogue dépendant de owner et non modale |
JDialog (Frame owner,
boolean modal) |
Construit une boîte de
dialogue dépendant de owner, avec une modalité |
JDialog (Frame owner,
String titre) |
Construit une boîte de
dialogue dépendant de owner, avec un titre, et non
modale |
JDialog (Frame owner,
String titre, boolean modal) |
Construit une boîte de
dialogue dépendant de owner, avec un titre, et une
modalité |
Principales méthodes :
voiddispose() |
Détruit la boîte de
dialogue |
String
getTitle() |
Retourne le titre de la
boîte de dialogue |
voidhide() |
Cache la boîte de
dialogue |
booleanisModal() |
Retourne vrai si la boîte
est modale |
booleanisResizable() |
Indique si on peut
redimensionner la boîte |
voidsetModal(boolean b) |
Positionne la
modalité |
voidsetResizable(boolean resizable) |
Positionne la possibilité
de redimensionner. |
voidsetTitle(String title) |
Change le titre de la
boîte |
voidshow() |
Rend la boîte
visible. |
Exemple :
public class MonDialogue extends JDialog {
// les
données mises à jour par la boîte de dialogue
Integer lEntier = new
Integer(0);
String leNom;
public MonDialogue(JFrame f, String
titre, boolean modal) {
super(f,titre,
modal);
try {
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
// initialise les valeurs de la boîte de dialogue
// avec
les valeurs contenues dans le tableau
publicvoid initialise( Object
[] o){
lEntier =
(Integer)o[0];
leNom =
(String)o[1];
jTextField1.setText(lEntier.toString());
jTextField2.setText(leNom);
}
public void show(Object []
o){
initialise(o);
show();
}
//
récupère les données mises à jour par la boîte de dialogue
publicObject []
getDonnees(){
return new
Object[]{lEntier,leNom};
}
// les
methodes de réponse aux boutons OK et Cancel
voidjButtonOK_actionPerformed(ActionEvent e)
{
messages.setText("
");
try{
lEntier = new
Integer(jTextField1.getText());
leNom =
jTextField2.getText();
hide();
}catch(NumberFormatException
nfe){
messages.setText("entrer un
entier !");
}
}
void
jButtonCANCEL_actionPerformed(ActionEvent e) {
messages.setText("
");
hide();
}
//
l’interface
public MonDialogue()
{
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
BorderLayout borderLayout1 = new
BorderLayout();
JPanel jPanel1 = new
JPanel();
JTextField jTextField1 = new
JTextField();
JPanel jPanel2 = new
JPanel();
JButton jButton1 = new
JButton();
JButton jButton2 = new
JButton();
GridLayout gridLayout1 = new
GridLayout();
TitledBorder
titledBorder1;
JLabel jLabel1 = new
JLabel();
JLabel jLabel2 = new
JLabel();
JTextField jTextField2 = new
JTextField();
JLabel messages = new
JLabel();
private void jbInit()
throws Exception {
titledBorder1 = new
TitledBorder("");
jTextField1.setText("jTextField1");
jTextField1.setBounds(new Rectangle(101,
24, 92, 21));
jButton1.setText("OK");
jButton1.addActionListener(new
java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent
e) {
jButtonOK_actionPerformed(e);
}
});
jButton2.setText("Annuler");
jButton2.addActionListener(new
java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent
e) {
jButtonCANCEL_actionPerformed(e);
}
});
jPanel2.setLayout(gridLayout1);
gridLayout1.setRows(4);
gridLayout1.setColumns(1);
gridLayout1.setVgap(5);
jPanel2.setBorder(BorderFactory.createEtchedBorder());
jPanel1.setBorder(BorderFactory.createEtchedBorder());
jPanel1.setPreferredSize(new
Dimension(200, 1));
jPanel1.setLayout(null);
jLabel1.setFont(new
java.awt.Font("Dialog", 0, 14));
jLabel1.setHorizontalAlignment(SwingConstants.RIGHT);
jLabel1.setText("un
entier");
jLabel1.setBounds(new Rectangle(18, 24,
75, 17));
jLabel2.setFont(new
java.awt.Font("Dialog", 0, 14));
jLabel2.setHorizontalAlignment(SwingConstants.RIGHT);
jLabel2.setText("un
nom");
jLabel2.setBounds(new Rectangle(18, 56,
75, 17));
jTextField2.setText("jTextField2");
jTextField2.setBounds(new Rectangle(101,
57, 92, 21));
messages.setForeground(Color.red);
messages.setText("
");
this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
this.setResizable(false);
jPanel1.add(jLabel1,
null);
jPanel1.add(jTextField1,
null);
jPanel1.add(jLabel2,
null);
jPanel1.add(jTextField2,
null);
this.getContentPane().add(messages, BorderLayout.SOUTH);
this.getContentPane().add(jPanel2, BorderLayout.EAST);
jPanel2.add(jButton1,
null);
jPanel2.add(jButton2,
null);
this.getContentPane().add(jPanel1, BorderLayout.CENTER);
}
}
Pour utiliser la boîte de dialogue il faut :
MonDialogue
md1 = new MonDialogue(getFrame(),
"exemple
avec JDialog modal",
true);
md1.pack();
Puis :
md1.initialise(new Object[]{i,
nom});
md1.show();
Object
[] retour = md1.getDonnees();
i = (Integer)retour[0];
nom = (String)retour[1];
Si on veut empêcher la fermeture de la boîte de dialogue
par le bouton de fermeture, i suffit d’affecter à la propriété
defaultCloseOperation la valeur
DO_NOTHING_ON_CLOSE.