paesmarc
Messages postés24Date d'inscriptionmercredi 6 mai 2009StatutMembreDernière intervention22 août 2013
-
20 août 2013 à 14:28
paesmarc
Messages postés24Date d'inscriptionmercredi 6 mai 2009StatutMembreDernière intervention22 août 2013
-
22 août 2013 à 07:43
Bonjour,
J'utilise une Jtable qui au départ est 'vide'. Ensuite, je souhaite inclure des données mais l'affichage ne s'effectue pas !
Voici mon code pour plus de compréhension:
public class OrderLinesTableModel extends AbstractTableModel implements ListSelectionListener{
private Customer c;
private List<Order> ols;
private String[] columnNames={"Article","Qty","State","PriceInclTax","TotalInclTax", "Customer"};
private Facade facade;
private ResourceBundle resourceBundle;
public OrderLinesTableModel(Facade facade) {
this.facade=facade;
}
@Override
public void valueChanged(ListSelectionEvent e) {
c=(Customer)((JList)e.getSource()).getSelectedValue();
getOrderLine(c);
}
public void getOrderLine(Customer c){
ols = facade.getOrders(c);
fireTableDataChanged();
}
@Override
public int getRowCount() {
if(ols==null){
return 0;
}else{
return ols.size();
}
}
@Override
public String getColumnName(int column) {
resourceBundle=ResourceBundle.getBundle("MainView", Facade.getLocale());
return txt(columnNames[column]);
}
@Override
public int getColumnCount() {
return columnNames.length;
}
private String txt(String key){
return resourceBundle.getString(key);
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Order order = (Order) ols.get(rowIndex);
switch (columnIndex) {
case 0:
return order.getRefOrder();
case 1:
return order.getIdOrder();
case 2:
return "test";
case 3:
return "";
case 4:
return "";
case 5:
return "";
}
return null;
}
}
Quand à 'partir' de ma vue, je fais appel à la méthode getOrderLine(Customer c), je remplis ma liste <Order> ols. Ensuite, dans cette même méthode, j'effectue la méthode fireTableDataChanged() pour signaler à ma table que les données ont changé mais ça n'effectue aucun changement...
Est-ce que quelqu'un voit où est le problème ?
paesmarc
Messages postés24Date d'inscriptionmercredi 6 mai 2009StatutMembreDernière intervention22 août 2013 21 août 2013 à 09:14
Merci pour ton aide mais je n'ai jamais utilisé cette méthode et donc , je l'ai mise après la méthode fireTableDataChanged() comme tu m'as proposé mais ça ne marche pas (pas accepté).
Erreur lorsque j'essaye de mettre la méthode repaint(): cette méthode n'est pas définie pour la classe OrderLinesTableModel.
cs_Julien39
Messages postés6414Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention29 juillet 2020371 21 août 2013 à 09:22
C'est une méthode de JTable, je pense (je n'ai pas lu ton code) que tu modifies le modèle de la table mais que le composant graphique n'est pas rafraîchis
paesmarc
Messages postés24Date d'inscriptionmercredi 6 mai 2009StatutMembreDernière intervention22 août 2013 21 août 2013 à 10:50
Je souhaite afficher les commandes pour UN client. Dès lors, quand je sélectionne un client, je souhaite afficher ses commandes dans le JTable.
Ces clients, je les sélectionne à partir d'une JList. Donc, les commandes affiché dans la JTable doivent changer selon le client sélectionné dans la JList.
Dans mon code ci dessus, c'est à partir de la méthode valueChanged(ListSelectionEvent e) que je 'sélectionne' les commandes pour un client déterminé.
Rem: pour vérifier si mes commandes sont bien ajoutées à ma liste 'ols' (voir mon code), j'ai ajouté la boucle for(Order o:ols){system.out.println(o)} et mes commandes sont bien ajoutées dans ma liste 'ols'
Ensuite dans public void valueChanged(ListSelectionEvent e) écris le code qui te permet de modifier la JTable (que tu dois passer en paramètre du constructeur de la classe) et termine par table.repaint() sinon, rien ne sera affiché.
Et petite remarque en passant : une méthode qui commence par get doit normalement retourner quelque chose...
paesmarc
Messages postés24Date d'inscriptionmercredi 6 mai 2009StatutMembreDernière intervention22 août 2013 21 août 2013 à 14:07
Pour moi not.getTblOrderLines().repaint() n'a aucun effet puisque mon tableau ne se modifie pas.
Mais ma liste 'ols' a bien été modifiée avec les commandes (Order) du client sélectionné. Je vois ça avec mon ajout de la boucle for dans ma méthode getOrderLine(Customer c)
Ce que je ne comprends pas c'est que dans la méthode getRowCount() j'ai ajouté 2 system.out.println() comme suit:
public int getRowCount() {
if(ols==null){
system.out.println("RowCount = 0")
return 0;
}else{
system.out.println(("RowCount > 0")
return ols.size();
}
}
pour vérifier si quand je fais un fireTableDataChanged() cette méthode est réutilisée et bien ce n'est pas le cas.
Et donc, j'en conclu que dans ma méthode getValueAt(int rowIndex, int columnIndex), int rowIndex est toujours égal à 0
cs_Julien39
Messages postés6414Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention29 juillet 2020371 21 août 2013 à 15:00
Le fait que ta liste ols ait été modifiée n'a aucune importance, il faut que tu récupères le contenu du modèle de ta JTable. Si repaint n'a aucun effet, c'est que le contenu du modèle de ta JTable n'a pas été modifié par la méthode fireTableDataChanged n'a pas modifié le modele de la table.
paesmarc
Messages postés24Date d'inscriptionmercredi 6 mai 2009StatutMembreDernière intervention22 août 2013 22 août 2013 à 07:43
J'ai finalement trouvé. Dans ma facade (qui étend Observable), dans ma méthode qui modifie ma liste de commande, j'avais placé setChanged() et notifyObservers() en début de méthode à la place de les mettre en fin de méthode.
De plus, j'ai retravaillé légèrement mon code...
Je te remercie pour ton aide, ça m'a permis de mieux comprendre l'ensemble du code lié à une JTable.
Bàt.