'Rafraichir' un JTable [Résolu]

Signaler
Messages postés
24
Date d'inscription
mercredi 6 mai 2009
Statut
Membre
Dernière intervention
22 août 2013
-
Messages postés
24
Date d'inscription
mercredi 6 mai 2009
Statut
Membre
Dernière intervention
22 août 2013
-
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 ?

Merci d'avance.

Marc

11 réponses

Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
306
Salut,

Commences par ajouter un repaint() après le fireTableDataChanged
Messages postés
24
Date d'inscription
mercredi 6 mai 2009
Statut
Membre
Dernière intervention
22 août 2013

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.

Marc
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
306
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
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
306
Ton modèle a l'air un peu complexe, qu'est ce que tu cherches à faire ?

Tu devrais peut être étendre DefaultTableModel...
Messages postés
24
Date d'inscription
mercredi 6 mai 2009
Statut
Membre
Dernière intervention
22 août 2013

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'
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
306
Dans ce cas là, c'est bien un problème de repaint.

La conception ne va pas du tout, tu mélanges le modèle de liste et le modèle de JTable.

Tu trouveras ici comment modifier une JTable : http://codes-sources.commentcamarche.net/source/53881-redimensionner-une-jtable

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...
Messages postés
24
Date d'inscription
mercredi 6 mai 2009
Statut
Membre
Dernière intervention
22 août 2013

Hélas, pas de changement.
J'ai modifié ma méthode valueChanged(ListSelectionEvent e) comme suit :

public void valueChanged(ListSelectionEvent e) {
     c=(Customer)((JList)e.getSource()).getSelectedValue();
     getOrderLine(c);
     fireTableDataChanged();
     not.getTblOrderLines().repaint();
}

Où not.getTblOrderLines() est le getter qui me renvoie mon JTable
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
306
Quand dans cette méthode, après fireTableDataChanged(); tu appelles not.getTblOrderLines(), est-ce que le contenu a été modifié ?
Messages postés
24
Date d'inscription
mercredi 6 mai 2009
Statut
Membre
Dernière intervention
22 août 2013

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)
public void getOrderLine(Customer c){
	ols = facade.getOrders(c);
             for(Order o:ols){
             system.out.println(o)
             }
}


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
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
306
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.
Messages postés
24
Date d'inscription
mercredi 6 mai 2009
Statut
Membre
Dernière intervention
22 août 2013

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.

Marc