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

Java Discussion :

Combo: afficher sous-menu+couleur associé


Sujet :

Java

  1. #1
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 57
    Par défaut Combo: afficher sous-menu+couleur associé
    Bonjour

    J'ai 2 questions pour les Combo en Java:

    1) j'aimerais qu'on ne puisse pas changer la valeur par le clavier de ma combo mais seulement choisir un item dans la liste correspondante (pas de problème par setEditable ou setFocusable). mais dans le même temps j'aimerais que lorsque je chosiis une nouvelle valeur, ma "public void actionPerformed (ActionEvent e)" reconnaisse le changement or avec setEditable ou setFocusable ce n'est pas le cas=> aucune action.

    2) admettons que le code de ma combo soit le suivant:
    combo=new JComboBox ("Paris","Lyon","Marseille","Madrid","Barcelone","Valencia");
    combo.setEditable(true);
    contenu.add(combo);
    combo.addActionListener(this) ;

    Je voudrais que pour les villes françaises qu'elles apparaissent en bleu dans la combo et les villes espagnoles en rouge dans la combo. voir photo option 1


    Et enfin est-il possible d'afficher "France" en tête de la liste au dessus des ville française et "Espagne" dans la lsite au dessus des villes espagnoles. mais que ces 2 nouveaux items ne soient pas selectionable. voir photo option 2


    L'ideal serait même d'avoir "France" et "Espagne! verticalement sur la gauche mais bon ça va commencer à être différent. voir photo option 3


    merci d'avance
    Images attachées Images attachées    

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Citation Envoyé par dcvman Voir le message
    1) j'aimerais qu'on ne puisse pas changer la valeur par le clavier de ma combo mais seulement choisir un item dans la liste correspondante (pas de problème par setEditable ou setFocusable). mais dans le même temps j'aimerais que lorsque je chosiis une nouvelle valeur, ma "public void actionPerformed (ActionEvent e)" reconnaisse le changement or avec setEditable ou setFocusable ce n'est pas le cas=> aucune action.
    Si tu ne change rien à ta JComboBox, l'actionPerformed fonctionne et les valeurs ne sont pas éditable :
    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
    	public static void main(String[] args) {
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		final JComboBox combo = new JComboBox(new Object[]{"Paris","Lyon","Marseille","Madrid","Barcelone","Valencia"});
    		combo.addActionListener(new ActionListener() {			
    			public void actionPerformed(ActionEvent e) {
    				System.out.println(combo.getSelectedItem());
    			}
    		});
     
    		frame.add(combo);
    		frame.pack();
    		frame.setVisible(true);
    	}
    Citation Envoyé par dcvman Voir le message
    Je voudrais que pour les villes françaises qu'elles apparaissent en bleu dans la combo et les villes espagnoles en rouge dans la combo. voir photo option 1
    Fabrique toi un class Ville avec un attribut pays et le getter qui correspond, puis fabrique toi un ListCellRenderer qui te permettra de faire un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(value.getPays.equals("FR"))setBackground(Color.BLUE);
    avec le ListCellRenderer tu pourras aussi ajouter le pays au dessus des tes villes. Pour ne pas l'avoir au dessus de toutes les villes, tu pourras faire un truc du genre : si l'élément précédent est du même pays, ne pas afficher le pays.

    Pour ta dernière question, je sèche... à part fabriquer toi même ton composant...
    Ou alors, voir autre proposition en pièce jointe relativement facile avec le ListCellRenderer
    Images attachées Images attachées  

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Un exemple d'un début (à améliorer bien entendu):
    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
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Vector;
     
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.ListCellRenderer;
     
     
    public class Test {
     
     
    	public static void main(String[] args) {
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		Vector<Ville> villes = new Vector<Ville>();
    		villes.add(new Ville("Paris", "FR"));
    		villes.add(new Ville("Lyon", "FR"));
    		villes.add(new Ville("Marseille", "FR"));
    		villes.add(new Ville("Madrid", "ES"));
    		villes.add(new Ville("Barcelone", "ES"));
    		villes.add(new Ville("Valencia", "ES"));
     
    		final JComboBox combo = new JComboBox(villes);
    		combo.setRenderer(new Ville());
    		combo.addActionListener(new ActionListener() {			
    			public void actionPerformed(ActionEvent e) {
    				System.out.println(((Ville)combo.getSelectedItem()).getNom());
    			}
    		});
     
    		frame.add(combo);
    		frame.pack();
    		frame.setVisible(true);
    	}
     
     
    }
     
    class Ville implements ListCellRenderer {
    	private String nom;
    	private String pays;
     
    	public Ville(){};
     
    	public Ville(String nom, String pays) {
    		this.nom = nom;
    		this.pays = pays;
    	}
     
    	public String getNom(){
    		return nom;
    	}
     
    	public String getPays(){
    		return pays;
    	}
     
    	public Component getListCellRendererComponent(JList list, Object value,	int index, boolean isSelected, boolean cellHasFocus) {
    		JPanel pan = new JPanel(new BorderLayout());
     
    		Ville ville = (Ville)value;
     
    		JLabel nom = new JLabel(ville.getNom());
    		JLabel pays = new JLabel(ville.getPays());
     
    		nom.setOpaque(true);
     
    		if(ville.getPays().equals("FR"))nom.setBackground(Color.BLUE);
    		else if(ville.getPays().equals("ES"))nom.setBackground(Color.RED);
     
    		pan.add(nom, BorderLayout.CENTER);
    		pan.add(pays, BorderLayout.EAST);
     
    		return pan;
    	}
    }

  4. #4
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 57
    Par défaut
    Merci beaucoup caaldor.

    pour la combo pas editable, ça marche trées bien , excellent.

    pour le reste je vais fianleemnt utilisé jsute les couleurs en fond, c'est suffisant-

    Tu penses que je peux simplifier du coup ton code en utilisant le rang
    int rang=combo1.getSelectedIndex()

    Je suis désolé mais en fait ça fait que 2 semaines que j'ai commencé à programmer en Java et même si j'apprend realtivement vite j'ai encore bcp de lacunes...

    a+++

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Citation Envoyé par dcvman Voir le message
    Tu penses que je peux simplifier du coup ton code en utilisant le rang
    int rang=combo1.getSelectedIndex()
    Que veux tu dire par là ?

  6. #6
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 57
    Par défaut
    non rien, juste savoir si on desire seulement les couleurs mais finalement pas les titres "France" et "Espagne", si on peut utiliser un code simplifié. car comme je t'ai dit, je suis débutant.

    mais en fait je vais bien analyser ton code, comme ça je vais en apprendre plus et je vais l'integrer.

    Un grand merci en tout cas pour la réponse super rapide.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Voilà un peu plus d'explication sur le Renderer qui sert à dessiner tes lignes :
    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
    	public Component getListCellRendererComponent(JList list, Object value,	int index, boolean isSelected, boolean cellHasFocus) {
    		// On prépare le composent qui servira à afficher une ligne de la ComboBox
    		JPanel pan = new JPanel(new BorderLayout());
     
    		// On indique que le paramètre value est de type Ville (ce qui permettra d'utiliser les méthodes de la class Ville)
    		Ville ville = (Ville)value;
     
    		// On fabrique des Label pour le nom de la ville et du pays
    		JLabel nom = new JLabel(ville.getNom());
    		JLabel pays = new JLabel(ville.getPays());
     
    		// Pour que la coloration du background d'un JLabel soit visible, il faut que le composant soit opaque
    		nom.setOpaque(true);
     
    		// Gestion de la couleur du fond
    		if(ville.getPays().equals("FR"))nom.setBackground(Color.BLUE);
    		else if(ville.getPays().equals("ES"))nom.setBackground(Color.RED);
     
    		// Ajout des Label dans notre composant représentant une ligne de la ComboBox
    		pan.add(nom, BorderLayout.CENTER);
    		pan.add(pays, BorderLayout.EAST);
     
    		// On retourne notre Composant
    		return pan;
    	}

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Allez pour la route, j'ai un peu amélioré la visualisation :
    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
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Vector;
     
    import javax.swing.BorderFactory;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.ListCellRenderer;
     
     
    public class Test {
     
     
    	public static void main(String[] args) {
    		JFrame frame = new JFrame();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		Vector<Ville> villes = new Vector<Ville>();
    		villes.add(new Ville("Paris", "FR"));
    		villes.add(new Ville("Lyon", "FR"));
    		villes.add(new Ville("Marseille", "FR"));
    		villes.add(new Ville("Madrid", "ES"));
    		villes.add(new Ville("Barcelone", "ES"));
    		villes.add(new Ville("Valencia", "ES"));
     
    		final JComboBox combo = new JComboBox(villes);
    		combo.setRenderer(new Ville());
    		combo.addActionListener(new ActionListener() {			
    			public void actionPerformed(ActionEvent e) {
    				System.out.println(((Ville)combo.getSelectedItem()).getNom());
    			}
    		});
     
    		frame.add(combo);
    		frame.setSize(200, 50);
    		frame.setVisible(true);
    	}
     
     
    }
     
    class Ville implements ListCellRenderer {
    	private String nom;
    	private String pays;
     
    	public Ville(){};
     
    	public Ville(String nom, String pays) {
    		this.nom = nom;
    		this.pays = pays;
    	}
     
    	public String getNom(){
    		return nom;
    	}
     
    	public String getPays(){
    		return pays;
    	}
     
    	public Component getListCellRendererComponent(JList list, Object value,	int index, boolean isSelected, boolean cellHasFocus) {
    		// On prépare le composent qui servira à afficher une ligne de la ComboBox
    		JPanel pan = new JPanel(new BorderLayout());
     
    		// On indique que le paramètre value est de type Ville (ce qui permettra d'utiliser les méthodes de la class Ville)
    		Ville ville = (Ville)value;
     
    		// On fabrique des Label pour le nom de la ville et du pays
    		JLabel nom = new JLabel(ville.getNom());
    			// Pour que la coloration du background d'un JLabel soit visible, il faut que le composant soit opaque
    			nom.setOpaque(true);
     
    		JLabel pays = new JLabel(ville.getPays(), JLabel.CENTER);
    			// Ajout du cardre
    			pays.setBorder(BorderFactory.createLineBorder(Color.BLACK));
    			pays.setPreferredSize(new Dimension(30, 30));
     
    		// Gestion de la couleur du fond
    		if(ville.getPays().equals("FR"))nom.setBackground(new Color(207, 225, 244));
    		else if(ville.getPays().equals("ES"))nom.setBackground(new Color(255, 126, 88));
     
    		// 
    		if(isSelected)nom.setBackground(Color.GRAY);
     
    		// Ajout des Label dans notre composant représentant une ligne de la ComboBox
    		pan.add(nom, BorderLayout.CENTER);
    		pan.add(pays, BorderLayout.EAST);
     
    		// On retourne notre Composant
    		return pan;
    	}
    }
    Par contre pour mettre le Pays Vertical il y a des méthodes, mais c'est plus compliqué. Si tu y tiens, fais une recherche => JLabel Vertical.

  9. #9
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 57
    Par défaut
    merci je vais analyser attentivement et j'aurais surement des questions.

    c'est sympa

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

Discussions similaires

  1. [CSS 2.1] Menu déroulant : afficher sous menu sur toute la largeur de l'écran
    Par joums dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 09/03/2010, 23h06
  2. Afficher sous-menu dans GridView (MouseDown)
    Par Potus dans le forum Windows Forms
    Réponses: 1
    Dernier message: 22/12/2009, 16h58
  3. afficher et masquer un sous menu
    Par arnolem dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 25/04/2006, 11h47
  4. Réponses: 27
    Dernier message: 03/10/2005, 13h11
  5. Afficher/Cacher un sous menu au clic
    Par Toutankharton dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 28/09/2005, 16h18

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