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 :

Jtable avec model, avec une colonne JComboBox avec model


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2009
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 308
    Par défaut Jtable avec model, avec une colonne JComboBox avec model
    Bonjour,

    J'essaye de remplir une Jtable depuis un arraylist dont une colonne est aussi un arraylist, et cette colonne est sous forme de comboBox.
    le model de ma table :

    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
    public class LivresModel extends AbstractTableModel {
    	private final String[] titresColonnes;
    	private ListeLivres livres;
     
    	public LivresModel(String[] titresColonnes,ListeLivres livres){
    		this.titresColonnes=titresColonnes;
    		this.livres=livres;
     
    	}
    	@Override
    	public int getColumnCount() {
    		return titresColonnes.length;
    	}
     
    	@Override
    	public int getRowCount() {
    		// TODO Auto-generated method stub
    		return livres.size();
    	}
     
    	@Override
    	public Object getValueAt(int rowIndex, int columnIndex) {
     
    		switch (columnIndex) {
    		//"Cote", "Titre", "Date Edition","Theme", "Editeur", "Description","Auteurs"
    		case 0:
    			// cote
    			return livres.get(rowIndex).getCote();
     
    		case 1:
    			// titre
    			return livres.get(rowIndex).getTitre();
     
    		case 2:
    			// Date edition
    			return livres.get(rowIndex).getDateEdition();
     
    		case 3:
    			// Theme
    			return livres.get(rowIndex).getTheme().getTheme();
     
    		case 4:
    			//Editeur
    			return livres.get(rowIndex).getEditeur().getNom();
    		case 5:
    			// Description
    			return livres.get(rowIndex).getDescription();
    		case 6:
    			// Auteurs
    			return livres.get(rowIndex).getAuteurs();
     
     
    		default:
    			throw new IllegalArgumentException();
    		}
    	}
    	@Override
    	public String getColumnName(int columnIndex) {
    		return titresColonnes[columnIndex];
    	}
     
    	public ListeLivres getLivres() {
    		return livres;
    	}
    	@Override
    	public Class<? extends Object> getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }
     
     
     
    }
    Alors simplement j'arrive a faire le TableCellRenderer comme ceci :

    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
    package utilitaires;
     
    import java.awt.Component;
    import java.util.Iterator;
     
    import javax.swing.JComboBox;
    import javax.swing.JTable;
    import javax.swing.table.TableCellRenderer;
     
    import metier.Auteur;
    import metier.Collections.CollAuteurs;
     
    public class ComboBoxRenderer implements TableCellRenderer
    {
    	private TableCellRenderer delegate;
    	public ComboBoxRenderer(TableCellRenderer defaultRenderer)
    	{
    		this.delegate = defaultRenderer;
     
    	}
     
    	public Component getTableCellRendererComponent(JTable table, Object value, 
    			boolean isSelected, boolean hasFocus, int row, int column) {
     
    		//remember - the default renderer is a label instance for values of data types String, Object and Number    
    		Component c = delegate.getTableCellRendererComponent(table, value, isSelected,hasFocus, row, column);
     
    		CollAuteurs<Auteur> auteurs =  (CollAuteurs<Auteur>) value;
    		JComboBox<String> combo = new JComboBox<>();
    		Iterator<Auteur> iter = auteurs.iterator();
    		while (iter.hasNext()) {
    			Auteur auteur = iter.next();
    			combo.addItem(auteur.getNom());
    		}
     
    		combo.setEditable(true);
    		c = combo;	
     
    		return c;
    	}
    }
    J'applique le tableCellRenderer a la colonne 6 de ma table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TableCellRenderer defaultRenderer  = paneltable.getTable().getDefaultRenderer(Object.class);
    		TableCellRenderer comboRenderer   = new ComboBoxRenderer(defaultRenderer);
     
    		paneltable.getTable().getColumnModel().getColumn(6).setCellRenderer(comboRenderer);
    Ce qui me donne ceci :


    Seulement j'aimerais faire un model de Combo pour ne pas devoir boucler avec l'iterator sur la collectionAuteur

    J'ai donc fait un model :

    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
     
    public class JComboBoxModel extends AbstractListModel implements
    ComboBoxModel {
    	private Object selectedItem;
     
    	private CollAuteurs<Auteur> anArrayList;
     
    	public JComboBoxModel(CollAuteurs<Auteur> value) {
    		anArrayList =  value;
    	}
     
    	public Object getSelectedItem() {
    		return selectedItem;
    	}
     
    	public void setSelectedItem(Object newValue) {
    		selectedItem = newValue;
    	}
     
    	public int getSize() {
    		return anArrayList.size();
    	}
     
    	public Object getElementAt(int i) {
    		return anArrayList.get(i);
    	}
    }
    Et j'ai donc enlevé la boucle et remplacé par ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    JComboBox<String> combo = new JComboBox<>(new JComboBoxModel((CollAuteurs<Auteur>) value));
    c = combo;
    Resultat :

    J'ai écrémé pas mal d'exemple de code, de post sur le forum sur les jcombobox dans des jtable mais j'ai pas vu de cas ou la table était basée sur un model don la source de donnée est une arraylist, et don une de ses colonnes est également une arraylist.


    Vous pouvez m'éclairer ?

    Merci

    Edit: pourtant le combobox contient bien mon arraylist d'auteur :

  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,

    il faut que tu sélectionnes ta valeur par défaut explicitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public JComboBoxModel(CollAuteurs<Auteur> value) {
       anArrayList =  value;
       if( anArrayList!=null && anArrayList.size()!=0 ) {
           selectedItem=anArrayList.get(0);
        }
    }
    En fait, c'est fait implicitement dans le addElement du DefaultComboBoxModel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void addElement(Object anObject) {
            objects.addElement(anObject);
            fireIntervalAdded(this,objects.size()-1, objects.size()-1);
            if ( objects.size() == 1 && selectedObject == null && anObject != null ) {
                setSelectedItem( anObject );
            }
        }
    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 éclairé
    Inscrit en
    Avril 2009
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 308
    Par défaut
    Bon ben c'est résolu

    Maintenant ya plus qu'a... faire le tableCellEditor , pour rendre cette combo éditable et sélectionnable.

    Merci

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

Discussions similaires

  1. [MySQL] récupérer la valeur d'une colonne maj avec update
    Par pas30 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 06/07/2008, 20h28
  2. remplir une colonne entière avec la même valeur
    Par potili2 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 13/11/2007, 12h24
  3. Réponses: 11
    Dernier message: 18/10/2007, 12h49
  4. export -> excel avec insertion d'une colonne vide
    Par Gary_Stoupy dans le forum Access
    Réponses: 5
    Dernier message: 16/01/2007, 11h11
  5. Réponses: 6
    Dernier message: 10/08/2006, 15h45

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