'Rafraichir' un JTable

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

11 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
21 août 2013 à 08:19
Salut,

Commences par ajouter un repaint() après le fireTableDataChanged
0
paesmarc Messages postés 24 Date d'inscription mercredi 6 mai 2009 Statut Membre Dernière intervention 22 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.

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

Tu devrais peut être étendre DefaultTableModel...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
paesmarc Messages postés 24 Date d'inscription mercredi 6 mai 2009 Statut Membre Dernière intervention 22 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'
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
21 août 2013 à 11:04
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...
0
paesmarc Messages postés 24 Date d'inscription mercredi 6 mai 2009 Statut Membre Dernière intervention 22 août 2013
21 août 2013 à 13:25
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
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
21 août 2013 à 13:49
Quand dans cette méthode, après fireTableDataChanged(); tu appelles not.getTblOrderLines(), est-ce que le contenu a été modifié ?
0
paesmarc Messages postés 24 Date d'inscription mercredi 6 mai 2009 Statut Membre Dernière intervention 22 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)
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
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
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.
0
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
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
0
Rejoignez-nous