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:
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:
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:
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 :
http://s17.postimg.org/os1gutxuz/Auteurs.png
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:
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:
1 2
| JComboBox<String> combo = new JComboBox<>(new JComboBoxModel((CollAuteurs<Auteur>) value));
c = combo; |
Resultat :http://s24.postimg.org/nuph693rl/Auteur_2.png
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 :
http://s2.postimg.org/gfoav2fh5/debug.png