IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Agents de placement/Fenêtres Java Discussion :

Fenêtre non modale agissant comme JOptionPane


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut Fenêtre non modale agissant comme JOptionPane
    Bonjour

    Dans le cadre d'un projet, dans une méthode, j'ai besoin d'afficher une interface graphique de saisie et d'attendre la saisie de l'utilisateur avant de passer plus lion.

    J'aimerais donc quelque chose comme JOptionPane.showInputDialog, sauf que la saisie est un peu plus complexe et j'ai besoin d'ajouter des actions et d'autres champs.

    A ce moment-là, je n'ai pas de fenêtre principale déjà ouverte, je suis obligé d'attendre la saisie pour afficher quoi que ce soit.

    Je suis sûr d'avoir déjà vu une solution sur le forum, il me semble avec un simple système de notify/wait, mais je n'ai pas réussi à retrouver cette solution et je ne sais pas si c'est la meilleure des solutions.

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Baptiste Wicht Voir le message
    Je suis sûr d'avoir déjà vu une solution sur le forum, il me semble avec un simple système de notify/wait, mais je n'ai pas réussi à retrouver cette solution et je ne sais pas si c'est la meilleure des solutions.
    Oulà je pense que c'est se chercher des complications alors que la solutions est toute faite ou presque

    Il faut utiliser JOptionPane !!!


    Cela peut sembler anodin, mais le paramètres "message" des méthodes showXXX() peut correspondre à un tableau. Dans ce cas les éléments qui le composent seront affichés les uns au dessus des autres dans la boite de dialogue. Les éléments du tableau sont géré selon leurs types :
    • S'il s'agit d'un tableau, ses éléments seront empilé les un en dessous des autres (on peut donc englober les tableaux de manière récursif).
    • Les composants Swing sont inséré tel quel (le layout du JOptionPane utilise la preferredSize si possible )
    • Les Icons sont inséré dans un JLabel pour y être affiché.
    • Enfin tous les autres types d'objets sont affiché dans un JLabel après avoir été convertis en String via toString()


    Cela permet de faire vraiment tout (au pire il suffit de placer un JPanel contenant les composants que l'on souhaite).

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    	JPanel panel = new JPanel();
    	panel.add(new JCheckBox("Check 1"));
    	panel.add(new JCheckBox("Check 2"));
    	panel.add(new JCheckBox("Check 3"));
     
     
    	JOptionPane.showMessageDialog(null,
    		new Object[] {
    			"Hello World !",		// Les chaines seront converties en JLabel
    			new JPasswordField(),	// Les composants graphique seront ajouté tel quel
    			panel,					// Cela peut être des composants complexe...
    			// Les tableaux sont traités de la même manière :
    			new Object[] {new JRadioButton("Radio 1"), new JRadioButton("Radio 2")}
    		}
    	);
    Ceci affichera :
    • Le message "Hello World".
    • Un champ de saisie de mot de passe.
    • Un panel contenant 3 checkbox cote à cote.
    • 2 bouton radio l'un au dessus de l'autre.



    Cela regle ton premier problème : tu peux faire toutes les saisies complexes que tu souhaites





    Ton second problème vient du fait que les boutons OK/Cancel... des JOptionPane ferment la boite de dialogue sans vérifier les données, ce qui peut être gênant (il n'est pas très esthétique de ré-afficher une fenêtre).

    Pour éviter cela il faut utiliser le paramètre "options" avec des JButtons, ce qui permet de remplacer le traitements des boutons et de ne valider les choix que lorsqu'on le souhaite réellement.

    Il suffit juste de définir (ou pas) la valeur du JOptionPane pour fermer la fenêtre...

    Exemple vite fait avec une demande de mot de passes simplifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    	}
    A adapter selon tes besoins

    a++

  3. #3
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Nickel, c'est parfait

    Je savais pas qu'on pouvait adapter à ce point un JOptionPane, c'est cool.

    beaucoup

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Avril 2004
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    J'ai également voulu faire un peu de "tuning" avec un JOptionPane.
    Pour cela, j'ai créé un panel dans lequel j'ai rajouté mes checkbox qui me vont bien.
    Par contre, dans ce cas là, je n'ai pas les boutons OK, NO géré graçe au JOptionPane.YES_NO_OPTION.

    Est il possible d'ajouter des éléments swing au JOptionPane via l'intermédiaire d'un tableau d'objet et d'avoir également la gestion automatique des bouton YES NO CANCEL du JOptionPane?

    En même temps, après avoir bien lu tous les commentaires de code de adiGuba :
    // Le type des boutons (ignoré car on utilise 'options'
    Je pense que ma réponse est là !

    Merci d'avance.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fenêtre non modale à patir d'une DLL
    Par Chachane dans le forum MFC
    Réponses: 2
    Dernier message: 07/02/2010, 17h34
  2. Fenêtre non modale
    Par ToraTora dans le forum MFC
    Réponses: 8
    Dernier message: 21/05/2008, 18h12
  3. Ouverture d'une fenêtre non modale dans un Thread
    Par Cyrill26 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/02/2008, 17h30
  4. Réponses: 1
    Dernier message: 30/05/2006, 22h54
  5. Réponses: 4
    Dernier message: 13/06/2004, 15h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo