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

AWT/Swing Java Discussion :

Personnaliser un JOptionPane


Sujet :

AWT/Swing Java

  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Points : 1 212
    Points
    1 212
    Par défaut Personnaliser un JOptionPane
    Bonjour,

    Afin de réaliser des éléments de types popup, j'étais tout d'abord parti sur un JDialog personnalisé, et cela fonctionnait plutôt bien (du point de vue de la personnalisation du composant).
    Puis j'ai découvert JOptionPane, qui semble tout indiqué pour gérer des affichages de popup. Le soucis que j'ai est maintenant de personnaliser les messages du JOptionPane comme je pouvais le faire auparavant avec un JDialog.

    Plus précisément, j'ai déjà trouvé plusieurs topics traitant de problèmes similaires (celui-ci étant très complet dans sa réponse par exemple), mais il reste une chose que je n'arrive pas à faire : rendre le JOptionPane sans bordure, c'est-à-dire obtenir le même résultat que si je faisais un setUndecorated(true) sur une JFrame.

    Est-ce que quelqu'un aurait une idée sur la faisabilité de la chose ?

    Merci.

    Mako.

  2. #2
    Membre expérimenté Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 340
    Points : 1 576
    Points
    1 576
    Par défaut
    Bonjour,

    la propriété Undecorated, n'apparait qu'à partir de la classe awt.Dialog qui hérite de JWindow qui hérite de Container
    JDialog descend de cette lignée.
    Quant à JOptionPane, elle a bien en commun l'ancêtre JContainer mais on voit que les lignées se séparent à partir de là.
    Donc je ne vois pas de solution à ce problème.

    Qu'est-ce qui vous a fait passer de JDialog à JOptionPane ?

    Pour info, j'ai moi aussi décidé de construire des boites de dialogue personnalisées, pour lesquelles j'avais besoin d'avoir un style 'Undecorated'. J'avais commencé aussi avec un héritage de JDialog mais j'ai dû me rabattre sur un héritage de JPanel. C''est assez tarabiscoté. La raison est dans ce post: http://www.developpez.net/forums/d10...d-sous-ubuntu/
    @ bientôt...

    Salut & @+ sur 3W!

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Points : 1 212
    Points
    1 212
    Par défaut
    Citation Envoyé par rtg57 Voir le message
    Qu'est-ce qui vous a fait passer de JDialog à JOptionPane ?
    Le fait que les messages du JOptionPane implémentent directement les mécanismes inhérents au système de popup (par exemple, attendre que l'utilisateur ait répondu à une popup de confirmation avant de continuer le programme), et que par conséquent, cela devrait être bien plus propre que les différentes petites bidouilles que j'étais en train de faire par-ci par-là...

    A vrai dire, ce n'est pas la bordure en elle-même qui me dérange, mais plutôt le fait que l'on puisse fermer le message sans passer par les boutons principaux (en cliquant sur la croix).

    Je pense que je vais me résigner à laisser cela tel quel (mais je suis toujours preneur si quelqu'un a une piste, juste par curiosité).

    Citation Envoyé par rtg57 Voir le message
    Pour info, j'ai moi aussi décidé de construire des boites de dialogue personnalisées, pour lesquelles j'avais besoin d'avoir un style 'Undecorated'. J'avais commencé aussi avec un héritage de JDialog mais j'ai dû me rabattre sur un héritage de JPanel. C''est assez tarabiscoté. La raison est dans ce post: http://www.developpez.net/forums/d10...d-sous-ubuntu/
    J'étais déjà tombé sur cette discussion pendant mes recherches

    Merci.

    Mako.

  4. #4
    Membre actif Avatar de akrom
    Homme Profil pro
    Automaticien
    Inscrit en
    Mai 2003
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Automaticien
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 115
    Points : 201
    Points
    201
    Par défaut
    Citation Envoyé par Mako 5013 Voir le message
    Le fait que les messages du JOptionPane implémentent directement les mécanismes inhérents au système de popup (par exemple, attendre que l'utilisateur ait répondu à une popup de confirmation avant de continuer le programme), et que par conséquent, cela devrait être bien plus propre que les différentes petites bidouilles que j'étais en train de faire par-ci par-là...
    Les JDialog peuvent être modal et donc attendre qu'il soit fermé pour continuer l'appli.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jDialog.setModal(true);
    pour ce qui est de la fermeture par la croix le JOptionPane.showConfirmDialog() retourne -1 et annuler retourne 2 , à toi de voir si tu peut faire le même traitement pour les 2 cas. Pour les autres JOptionPane il faut vérifier.
    On peut tout faire seul avec de la persévérance mais ça va plus vite à plusieurs.

    Je ne répondrais pas aux questions technique par MP .

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Points : 1 212
    Points
    1 212
    Par défaut
    Citation Envoyé par akrom Voir le message
    Les JDialog peuvent être modal et donc attendre qu'il soit fermé pour continuer l'appli.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jDialog.setModal(true);
    Le "problème" que j'avais était plutôt de récupérer une valeur de retour en fonction du choix de l'utilisateur. En gros, j'avais un afficherPopupConfirmation() qui me retournait une valeur (par exemple 1 pour "Ok", 2 pour "Annuler", etc.). Mais je devais bien attendre que le choix ait été fait avant de récupérer le retour de ma fonction...

    Enfin bref, là n'est pas le sujet.

    Citation Envoyé par akrom Voir le message
    pour ce qui est de la fermeture par la croix le JOptionPane.showConfirmDialog() retourne -1 et annuler retourne 2 , à toi de voir si tu peut faire le même traitement pour les 2 cas.
    Ca par contre, je l'ignorais. Effectivement, cela va m'être utile.
    Merci du renseignement.

    Mako.

  6. #6
    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 Mako 5013 Voir le message
    A vrai dire, ce n'est pas la bordure en elle-même qui me dérange, mais plutôt le fait que l'on puisse fermer le message sans passer par les boutons principaux (en cliquant sur la croix).
    Malheureusement on ne peut pas supprimer la bordure "facilement". Par contre il est possible de désactiver le bouton "close" en réécrivant showOptionDialog() (à partir de là on peut refaire la majeur parties des showXXX() :
    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
    	public static int showOptionDialog(Component parentComponent,
    			Object message, String title, int optionType, int messageType,
    			Icon icon, Object[] options, Object initialValue)
    			throws HeadlessException {
    		JOptionPane pane = new JOptionPane(message, messageType, optionType,
    				icon, options, initialValue);
     
    		pane.setInitialValue(initialValue);
    		pane.setComponentOrientation(((parentComponent == null) ? JOptionPane
    				.getRootFrame() : parentComponent).getComponentOrientation());
     
    		JDialog dialog = pane.createDialog(parentComponent, title);
    		dialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
     
    		pane.selectInitialValue();
    		dialog.setVisible(true);
    		dialog.dispose();
     
    		Object selectedValue = pane.getValue();
     
    		if (selectedValue == null)
    			return JOptionPane.CLOSED_OPTION;
    		if (options == null) {
    			if (selectedValue instanceof Integer)
    				return ((Integer) selectedValue).intValue();
    			return JOptionPane.CLOSED_OPTION;
    		}
    		for (int counter = 0, maxCounter = options.length; counter < maxCounter; counter++) {
    			if (options[counter].equals(selectedValue))
    				return counter;
    		}
    		return JOptionPane.CLOSED_OPTION;
    	}
    Malheureusement, on ne peut pas faire la même chose avec le setUndecorated(), car le JDialog est déjà "displayable"...




    a++

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Points : 1 212
    Points
    1 212
    Par défaut
    Bonjour,

    Après avoir testé les différentes pistes proposées, je pense que je vais me contenter de traiter la fermeture "à la croix" à partir de sa valeur de retour.

    Même si la solution d'adiGuba se rapproche plus de ce que je voulais au départ, elle est également un poil plus lourde...

    En tout cas, merci à tous pour les conseils.

    Mako.

  8. #8
    Membre régulier Avatar de abdennour bouaicha
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2009
    Messages : 98
    Points : 112
    Points
    112
    Par défaut
    voila une petite solution magique pour personnaliser JoptionPane :

    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
     
      try {
                UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
            } catch ( ClassNotFoundException | InstantiationException | IllegalAccessException
                    | UnsupportedLookAndFeelException e ) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
           UIManager.put( "OptionPane.background", Color.RED );
            UIManager.put( "Panel.background", Color.RED );
            UIManager.put( "OptionPane.messagebackground", Color.YELLOW );
            UIManager.put( "OptionPane.messageForeground", Color.BLUE );
            UIManager.put( "OptionPane.font", PREFERENCE.FONT_ZONE );
            UIManager.put( "Button.background", Color.green );
            UIManager.put( "OptionPane.okButtonText", "D'accord" );
            JOptionPane jop = new JOptionPane();
            int option = jop.showConfirmDialog( null,
                    question,
                    title,
                    JOptionPane.YES_NO_OPTION,
                    JOptionPane.QUESTION_MESSAGE );

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

Discussions similaires

  1. Personnaliser l'aspect joptionpane
    Par black_night dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 29/08/2011, 09h57
  2. [JOptionPane]Personnaliser les options
    Par Core8 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 27/12/2006, 12h07
  3. Personnaliser un rapport d'erreur sous Windows XP
    Par Neilos dans le forum Windows
    Réponses: 5
    Dernier message: 21/11/2003, 18h13
  4. [FLASH MX2004] Personnaliser les scrollbars
    Par stephane eyskens dans le forum Flash
    Réponses: 10
    Dernier message: 09/10/2003, 12h53
  5. [VB6] [UserControl] Évènements personnalisés
    Par Frankywinky dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 27/05/2003, 17h56

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