'Rafraichir' un JTable [Résolu]

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

Répondre au sujet
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscriptionModérateurStatut 15 mars 2018 Dernière intervention - 21 août 2013 à 08:19
0
Utile
Salut,

Commences par ajouter un repaint() après le fireTableDataChanged
Commenter la réponse de cs_Julien39
paesmarc 24 Messages postés mercredi 6 mai 2009Date d'inscription 22 août 2013 Dernière intervention - 21 août 2013 à 09:14
0
Utile
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
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscriptionModérateurStatut 15 mars 2018 Dernière intervention - 21 août 2013 à 09:22
0
Utile
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
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscriptionModérateurStatut 15 mars 2018 Dernière intervention - 21 août 2013 à 09:23
0
Utile
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
paesmarc 24 Messages postés mercredi 6 mai 2009Date d'inscription 22 août 2013 Dernière intervention - 21 août 2013 à 10:50
0
Utile
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
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscriptionModérateurStatut 15 mars 2018 Dernière intervention - 21 août 2013 à 11:04
0
Utile
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
paesmarc 24 Messages postés mercredi 6 mai 2009Date d'inscription 22 août 2013 Dernière intervention - 21 août 2013 à 13:25
0
Utile
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
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscriptionModérateurStatut 15 mars 2018 Dernière intervention - 21 août 2013 à 13:49
0
Utile
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
paesmarc 24 Messages postés mercredi 6 mai 2009Date d'inscription 22 août 2013 Dernière intervention - 21 août 2013 à 14:07
0
Utile
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
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscriptionModérateurStatut 15 mars 2018 Dernière intervention - 21 août 2013 à 15:00
0
Utile
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
paesmarc 24 Messages postés mercredi 6 mai 2009Date d'inscription 22 août 2013 Dernière intervention - 22 août 2013 à 07:43
0
Utile
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.