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
| /**
* Recherche le JOptionPane dans les composants parents.
*/
private static JOptionPane getOptionPane(Component c) {
while (c!=null) {
if (c instanceof JOptionPane) {
return (JOptionPane) c;
}
c = c.getParent();
}
return null;
}
/**
* Modifie la valeur du JOptionPane contenant ce composant
*/
private static void setOptionPaneValue(Component c, Object value) {
JOptionPane optionPane = getOptionPane(c);
if (optionPane!=null) {
optionPane.setValue(value);
}
}
public static int showLoginDialog(Component parentComponent, Object message, String title) {
// On crée les composants graphiques qui nous seront utile :
// Un TextField pour le login
// Un PasswordField pour le mot de passe
// Un JLabel invisible qui contient le message d'erreur
final JTextField login = new JTextField();
final JPasswordField password = new JPasswordField();
final JLabel error = new JLabel("Couple login/mot de passe incorrect !");
error.setForeground(Color.RED);
error.setVisible(false);
// Puis on crée les boutons de validation de notre fenêtre :
final JButton ok = new JButton("Ok");
final JButton cancel = new JButton("Cancel");
// On doit gérer les actions de ces boutons :
// Le bouton OK validera le couple login/password
// avant de fermer la boite de dialogue :
ok.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// On vérifie les données
// (pour l'exemple je me contente de vérifier que le login soit égal à "fred" )
boolean loginOk = "fred".equals(login.getText());
if (loginOk) {
// Tout est OK on renvoit la valeur OK
// (cela provoquera la fermeture de la boite de dialogue
setOptionPaneValue(ok, JOptionPane.OK_OPTION);
} else {
// Sinon on affiche le message d'erreur :
error.setVisible(true);
// Et on repack la fenêtre :
Window w = SwingUtilities.windowForComponent(error);
if (w!=null) {
w.pack();
}
}
}
});
// Pour le bouton Cancel c'est plus simple
// il suffit d'envoyer le 'CANCEL'
cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setOptionPaneValue(cancel, JOptionPane.CANCEL_OPTION);
}
});
// On crée notre tableau de message :
Object[] allMessages = {
message, // Le 'message' recu en paramètre de la méthode
login, // La saisie du login
password, // Le mot de passage
error // Le message d'erreur
};
// On crée le tableau contenant nos boutons d'actions :
JButton[] options = {
ok,
cancel
};
return JOptionPane.showOptionDialog(
parentComponent, // composant parent (bloqué par le dialogue modal)
allMessages, // Le contenu de la boite de dialogue
title, // Le titre de la boite de dialogue
JOptionPane.OK_OPTION, // Le type des boutons (ignoré car on utilise 'options'
JOptionPane.QUESTION_MESSAGE, // Le style graphique de la boite de dialogue (modifie l'icône)
null, // Eventuellement on peut spécifier une icône
options, // Nos boutons d'action
null); // Eventuellement on peut présélectionner un bouton
} |
Partager