'Rafraichir' un JTable [Résolu]

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

Merci d'avance.

Marc
Afficher la suite 

11 réponses

Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
250
0
Merci
Salut,

Commences par ajouter un repaint() après le fireTableDataChanged
Commenter la réponse de cs_Julien39
Messages postés
24
Date d'inscription
mercredi 6 mai 2009
Statut
Membre
Dernière intervention
22 août 2013
0
Merci
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
Commenter la réponse de paesmarc
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
250
0
Merci
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
Commenter la réponse de cs_Julien39
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
250
0
Merci
Ton modèle a l'air un peu complexe, qu'est ce que tu cherches à faire ?

Tu devrais peut être étendre DefaultTableModel...
Commenter la réponse de cs_Julien39
Messages postés
24
Date d'inscription
mercredi 6 mai 2009
Statut
Membre
Dernière intervention
22 août 2013
0
Merci
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'
Commenter la réponse de paesmarc
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
250
0
Merci
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...
Commenter la réponse de cs_Julien39
Messages postés
24
Date d'inscription
mercredi 6 mai 2009
Statut
Membre
Dernière intervention
22 août 2013
0
Merci
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
Commenter la réponse de paesmarc
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
250
0
Merci
Quand dans cette méthode, après fireTableDataChanged(); tu appelles not.getTblOrderLines(), est-ce que le contenu a été modifié ?
Commenter la réponse de cs_Julien39
Messages postés
24
Date d'inscription
mercredi 6 mai 2009
Statut
Membre
Dernière intervention
22 août 2013
0
Merci
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
Commenter la réponse de paesmarc
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
250
0
Merci
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.
Commenter la réponse de cs_Julien39
Messages postés
24
Date d'inscription
mercredi 6 mai 2009
Statut
Membre
Dernière intervention
22 août 2013
0
Merci
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
Commenter la réponse de paesmarc