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 :

Popup + ComboBox aide


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 189
    Par défaut Popup + ComboBox aide
    Bonjour à tous ,

    Voilà j'ai une liste déroulante et je souhaiterais quand je sélectionne une valeur un Popup s'ouvre avec une nouvelle liste déroulante à l'intérieur de ce popup , j'ai cherché mais je n'aie pas réussi à le faire . Si quelqu'un aurait une solution à me proposer afin de résoudre ce probléme sa serait sympa.

    Merci d'avance .

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tu voudrais faire une JComboBox présentée en arbre plutôt qu'en liste, ou faire un menu popup hériarchique (avec cascade de menus) ? Ce n'est pas tout à fait la même chose (le manu est standard en Swing, mais pas le combo).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 189
    Par défaut
    Nom : Capture.PNG
Affichages : 441
Taille : 20,5 Ko

    Je souhaiterai quand je sélectionne ma région un pop up avec la liste des personnes de cette région comme sur la représentation et pouvoir sélectionner celle qui m'intéresse

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Ce qu'on voit à l'écran n'est vraissembablement pas une popup mais une fenêtre modale (avec bouton de fermeture). Ce n'est ni standard, ni franchement ergonomique à mon avis. Pourquoi ne pas filtrer une combo dans la partie nom/prénom qu'on voit à droite ?

    Sinon tu peux ouvrir une fenêtre modale avec combo avec la classe JOptionPane.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    JComboBox comboBox = new JComboBox();
    /*...*/
    JOptionPane.showConfirmDialog(null, comboBox);
    (ou showMessageDialog() si tu ne veux pas de bouton Annuler).
    Mais ça obligera à passer par 2 clics (un dans la combo, et un sur le bouton OK) pour la saisie parce qu'on a pas le contrôle sur le dialogue.

    Tu peux refaire une fenêtre similaire avec la classe JDialog, sans bouton OK et la fermer dès sélection dans la combo. Tu peux également la rendre non modale et autofermante sur perte du focus.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 189
    Par défaut
    Je n'avais pas pensé à ta solution , je vais regarder ca et merci pour ton aide

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    189
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 189
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Ce qu'on voit à l'écran n'est vraissembablement pas une popup mais une fenêtre modale (avec bouton de fermeture). Ce n'est ni standard, ni franchement ergonomique à mon avis. Pourquoi ne pas filtrer une combo dans la partie nom/prénom qu'on voit à droite ?

    Sinon tu peux ouvrir une fenêtre modale avec combo avec la classe JOptionPane.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    JComboBox comboBox = new JComboBox();
    /*...*/
    JOptionPane.showConfirmDialog(null, comboBox);
    (ou showMessageDialog() si tu ne veux pas de bouton Annuler).
    Mais ça obligera à passer par 2 clics (un dans la combo, et un sur le bouton OK) pour la saisie parce qu'on a pas le contrôle sur le dialogue.

    Tu peux refaire une fenêtre similaire avec la classe JDialog, sans bouton OK et la fermer dès sélection dans la combo. Tu peux également la rendre non modale et autofermante sur perte du focus.
    j'ai effectué des test mais j'ai un soucis car je souhaiterai que cela s'affiche seulement quand je change d'élément dans ma liste or là dés que j'arrive sur mon panel le PopUp s'affiche , j'ai fais un test quand l'index est égale à -1 mais sa passe dans la condition alors quand j'affiche dans la console l'index il est bien à -1

    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
     
     
    private JComboBox getCbxRegionRech() {
    		if (cbxRegionRech == null) {
    			cbxRegionRech = new JComboBox();
                            cbxRegionRech.setBounds(76, 145, 245, 44);
    			cbxRegionRech.setFont(new Font("Tahoma", Font.PLAIN, 16));
     
    			System.out.println(cbxRegionRech.getSelectedIndex());
     
    			cbxRegionRech.addActionListener(new ActionListener() {
    				public void actionPerformed(ActionEvent e) {
    					if(cbxRegionRech.getSelectedIndex() != -1){
    						JOptionPane.showConfirmDialog(null, "test");
    					}
    				}
    			});
    			lesRegions = AccesData.retreiveRegion();
    			cbxRegionRech.addItem("Sélectionner une region");
    			for(Region r : lesRegions){
     
    				cbxRegionRech.addItem(r.getLibelleRegion());
    			}
    		}
    		return cbxRegionRech;
    	}

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Je ne comprends pas trop pourquoi tu reçois un évènement avec un selectedIndex de -1 (à moins que tu fasses explicitement un setSelectedIndex(-1) quelque part ailleurs). Sinon ceci arrive aussi avec une JComboBox éditable, lorsqu'on appelle setSelectedItem avec un object inexistant dans la liste. Alors que ta combo n'est manifestement pas éditable.
    Je comprends encore moins pourquoi la condition du if ne pourrait pas être vérifiée alors que getSelectedIndex()==-1. Il n'y a pas de confusion avec une autre combo ?

    De toute manière, comme tu as un premier choix "bidon" servant de prompt ("Sélectionner une region"), tu devrais également ignorer ce cas dans l'écouteur, pour ne pas afficher de dialogue dans ce cas (le mieux étant carrément de supprimer l'option dès qu'un choix autre est fait, ce qui évite que l'utilisateur le choisisse). Encore le meilleur moyen serait de faire un "vrai" prompt, comme par exemple dans cet 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
    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
    public class ExamplePrompt {
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		JComboBox<String> combo = new JComboBox<>(); 
    		combo.setRenderer(new PromptComboBoxRenderer(combo, "Choisissez un truc...", Color.GRAY, Font.ITALIC)); 
     
    		for(int i=1; i<=10; i++) {
    			combo.addItem("Choix " + i);
    		}
     
    		combo.setSelectedIndex(-1);
     
    		frame.add(combo);
     
    		frame.setSize(300, 300);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    	public static class PromptComboBoxRenderer extends DefaultListCellRenderer {
     
    		private final String prompt;
    		private final Component combo;
    		private final Color foreground;
    		private final Color promptColor;
    		private final Font font;
    		private final Font promptFont;
     
    		public PromptComboBoxRenderer(JComboBox<?> combo, String prompt, Color promptColor, Integer promptStyle) {
    			this.prompt = prompt;
    			this.combo = combo;
    			this.foreground = combo.getForeground();
    			this.font = combo.getFont();
    			this.promptColor = promptColor==null?foreground:promptColor;
    			this.promptFont = promptStyle==null?font:this.font.deriveFont(promptStyle);
    		}
     
    		@Override
    		public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected,
    				boolean hasFocus) {
    			Component component = super.getListCellRendererComponent(list, value, index, isSelected, hasFocus);
    			if (index == -1 && value == null) {
    				setText(prompt);
    				combo.setFont(promptFont);
    				combo.setForeground(promptColor);
    			}
    			else {
    				combo.setFont(font);
    				combo.setForeground(foreground);
    			}
    			return component;
    		}
    	}
     
    }


    Déjà, tente en enregistrant l'ActionListener après avoir rempli la combo et fait ta première éventuelle sélection pour le prompt : tu n'auras pas la première sélection automatique.

    Eventuellement, tu peux éviter le problème de l'ouverture du dialogue lors d'un clic sur la valeur sélectionné en utilisant un ItemListener au lieu d'un ActionListener. L'évènement ne sera soulevé qu'en cas de changement de sélection. Mais il faudra ne traiter que les évènements de sélection (l'ItemListener reçoit également ceux de désélection).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    combo.addItemListener(e -> {
     
        if (e.getStateChange() == ItemEvent.SELECTED) {
           System.out.println("Sélection " + combo.getSelectedIndex());
        }
     
    });
    Ou alors mémoriser dans l'ActionListener le dernier choix et comparer (voir dans l'exemple suivant).


    Tu auras tout de même un problème avec la saisie au clavier, mais c'est inhérent à ton système : si on fait défiler les choix avec une flêche, on va avoir un dialogue qui s'affiche à chaque item.

    On peut éviter tous ces problèmes en faisant quelque chose comme ça :
    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
    class SelectionListener implements ActionListener, PopupMenuListener {
     
    			private int last=-1;
     
    			@Override
    			public void actionPerformed(ActionEvent e) {
     
    				if ( !combo.isPopupVisible()) {
    					selectionChangeCheck();
    				}
     
    			}
     
    			@Override
    			public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
    				selectionChangeCheck();
    			}
     
    			private void selectionChangeCheck() {
    				int index = combo.getSelectedIndex(); 
    				if ( index!=last ) {
    					// changement
    					last=index;
    					selectionChange(index);
    				}
    			}
     
    			private void selectionChange(int index) {
     
     
    				// ici faire l'action qu'on veut
    				System.out.println("Nouveau choix " + (index+1));
     
    			}
     
     
     
    			@Override
    			public void popupMenuCanceled(PopupMenuEvent e) {
    			}
     
    			@Override
    			public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
    			}
     
     
    }
    SelectionListener selectionListener = new SelectionListener();
    combo.addActionListener(selectionListener);
    combo.addPopupMenuListener(selectionListener);
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. [Débutant] Popup/liste aide à l'écriture du code
    Par patrickvier dans le forum VB.NET
    Réponses: 2
    Dernier message: 21/09/2012, 08h31
  2. Combobox :aide pour afficher le texte
    Par gontrand16 dans le forum IHM
    Réponses: 1
    Dernier message: 16/09/2008, 20h36
  3. Aide avec une popup et la page parente
    Par iomega dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 08/12/2005, 15h21
  4. combobox et les ClientDataSet aide
    Par max45 dans le forum Bases de données
    Réponses: 5
    Dernier message: 13/11/2005, 15h28
  5. [C#] Besoin d'aide sur l'affichage d'une combobox
    Par dcd3 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 08/10/2005, 00h43

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