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

Composants Java Discussion :

Problème JLIst et ListCellRenderer avec type non basic


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 2
    Par défaut Problème JLIst et ListCellRenderer avec type non basic
    Bonjour,

    Je cherche à utiliser une JList avec un type de donnée non basique qui est composé d'un string et d'un enum pouvant prendre trois valeurs.

    Cette classe est définie de la manière suivante :
    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
     
    public class CassyOption {
     
    	enum Type{
    		UNKNOWN,
    		REPLACE,
    		MERGE
    	};
     
    	Type type;
    	String name;
     
    	public CassyOption(String name) {
    		this.name = name;
    		this.type = Type.UNKNOWN;
    	}
     
    	public CassyOption(String name, Type t){
    		this.name = name;
    		this.type = t;
    	}
     
    	public String getName(){
    		return this.name;
    	}
     
    	public Type getType(){
    		return this.type;
    	}
     
    }


    Pour permettre un affichage de la JList avec ma classe, j'ai implémenté l'inteface ListCellRenderer pour cette classe. L'affichage doit être le nom du string de la classe CassyOpt ainsi que des JRadioButton qui permettront à un utilisateur final de sélectionner une des valeurs.

    La définition de cette classe est la suivante :

    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
     
    public class CassyOptionCellRenderer extends JPanel implements ListCellRenderer {
     
    	JRadioButton jrad1, jrad2, jrad3;
    	JLabel jlab;
     
     
    	public CassyOptionCellRenderer(){
     
    	}
     
    	public Component getListCellRendererComponent(JList list, Object value,
    			int index, boolean isSelected, boolean cellHasFocus) {
     
    		CassyOption caOpt = (CassyOption)value;
     
    		jlab = new JLabel();
    		jlab.setText(caOpt.getName());
    		this.add(jlab);
     
     
     
    		if(caOpt.getType() == CassyOption.Type.UNKNOWN){
    			jrad1 = new JRadioButton("?", true);
    			jrad2 = new JRadioButton("M", false);
    			jrad3 = new JRadioButton("R", false);
    		} 
    		else if(caOpt.getType() == CassyOption.Type.MERGE){
    			jrad1 = new JRadioButton("?", false);
    			jrad2 = new JRadioButton("M", true);
    			jrad3 = new JRadioButton("R", false);
    		}
    		else {
    			jrad1 = new JRadioButton("?", false);
    			jrad2 = new JRadioButton("M", false);
    			jrad3 = new JRadioButton("R", true);
    		}
     
    		this.add(jrad1);
    		this.add(jrad2);
    		this.add(jrad3);
     
    		System.out.println("getLisCellRenderer : " + caOpt.getName());
     
     
     
     
    		return this;
    	}
     
    }

    Dans la JList, j'insère initialement deux éléments. Le code de construction de la JList dans la classe de la fenêtre principale est le suivant :

    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
    this.setLayout(new BorderLayout());
     
    		DefaultListModel listModel = new DefaultListModel();
    		listModel.addElement(new CassyOption("nom1",CassyOption.Type.MERGE));
    		listModel.addElement(new CassyOption("nom2",CassyOption.Type.REPLACE));
     
     
    		JList list = new JList(listModel);
    		list.setCellRenderer(new CassyOptionCellRenderer());
     
    		JScrollPane listScroller = new JScrollPane(list);
    		this.getContentPane().add(listScroller,BorderLayout.EAST);
     
     
    		this.pack();
     
    		this.setVisible(true);

    Lors de l'exécution, j'aimerai obtenir tous les éléments de la liste en colonne avec les boutons jradio sur leur droite. Or, à l'exécution de ce code, j'obtiens 2 lignes (attendu), mais sur chaque ligne j'ai les éléments objets 1 et objets 2 qui sont affichés (pas attendu).

    Quelqu'un aurait t'il une idée de ce qui cloche dans ce que j'ai fait ?


    D'avance merci?

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 2
    Par défaut
    J'ai trouvé ce qui provoquait (au moins en partie) le bug à l'affichage.

    Dans la méthode getListCellRenderer, je cree un JLabel et des JRadio que j'ajoute après à ma fenêtre. Ce qui fais qu'à chaque appel à cette méthode un nouveau string et des jradio sont ajoutées sur la ligne.

    Pour corriger, il faut créer les JLabel et JRadio dans le constructeur de la classe qui implémente la méthode getListCellRenderer. La méthode getCellRenderer ne doit que modifier le contenu des JLabel et des JRadio à l'aide de setters.

    Merci à ceux qui ont pu réfléchir à mon problème.

Discussions similaires

  1. Problème lecture de tables avec données type Oui/non
    Par Alixe80 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 20/04/2008, 18h44
  2. Réponses: 2
    Dernier message: 27/01/2006, 17h47
  3. Problème de mutex avec Waitforsingleobject non-bloquant
    Par rvzip64 dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 03/11/2005, 12h02
  4. Problème de requete avec type monétaire
    Par Pymm dans le forum ASP
    Réponses: 11
    Dernier message: 09/09/2005, 17h57
  5. [debutant] problème avec type à utiliser
    Par mlequim dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 15/07/2005, 17h08

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