OVH Cloud OVH Cloud

[JTable] refresh en fin de table

2 réponses
Avatar
Olivier Savoie
Bonjour,
- mon interface graphique Swing comprend une JTable dans un scrollPane.

- J'ai cree une classe MonModel qui etend AbstractTableModel.
ce model est en charge de synchroniser les donnees avec la JTable via
une methode update
qui genere un evenement pour signaler les changements.

- Les changements sont
- update des donnees
- modification du nombre de lignes

- Les donnees sont contenus dans un Vecteur de Vecteur dans mon model.
Celui-ci est
correctement mis a jour lors des update.

-Mon probleme est Lorsque je genere un event, les donnees sont ajoutes a
la fin de la table et non pas
par dessus les donnees existantes.

-J'ai essaye les types d'evenements suivants seuls ou combines mais rien
n'y fait:

fireTableStructureChanged();
fireTableDataChanged();
fireTableChanged(new TableModelEvent(this,oldSize-(oldSize-
data.size())-1,oldSize,TableModelEvent.ALL_COLUMNS,
TableModelEvent.DELETE));
fireTableChanged(new
TableModelEvent(this,data.size()-(data.size()-oldSize)-1,data.size(),TableModelEvent.ALL_COLUMNS,
TableModelEvent.INSERT));
fireTableDataChanged();

-Quelqu'un a-t-il une idee pour me depanner ? merci.

Olivier

2 réponses

Avatar
Christophe M
Olivier Savoie wrote:

Bonjour,
- mon interface graphique Swing comprend une JTable dans un scrollPane.

- J'ai cree une classe MonModel qui etend AbstractTableModel.
ce model est en charge de synchroniser les donnees avec la JTable via
une methode update
qui genere un evenement pour signaler les changements.

- Les changements sont
- update des donnees
- modification du nombre de lignes

- Les donnees sont contenus dans un Vecteur de Vecteur dans mon model.
Celui-ci est
correctement mis a jour lors des update.

-Mon probleme est Lorsque je genere un event, les donnees sont ajoutes a
la fin de la table et non pas
par dessus les donnees existantes.

-J'ai essaye les types d'evenements suivants seuls ou combines mais rien
n'y fait:

fireTableStructureChanged();
fireTableDataChanged();
fireTableChanged(new TableModelEvent(this,oldSize-(oldSize-
data.size())-1,oldSize,TableModelEvent.ALL_COLUMNS,
TableModelEvent.DELETE));
fireTableChanged(new
TableModelEvent(this,data.size()-(data.size()-oldSize)-1,data.size(),TableModelEvent.ALL_COLUMNS,
TableModelEvent.INSERT));
fireTableDataChanged();

-Quelqu'un a-t-il une idee pour me depanner ? merci.

Olivier



Alors, si la structure (entendre ici les colonnes) ne change pas, et
qu'il y a juste plus ou moins de ligne dans ta table, ton modèle doit
juste faire un fireTableDataChanged(); ce qui doit normalement
rafraichir "automatiquement" la table.

Et si ça marche pas, c'est que tu as peut-être un problème dans le
"remplissage" de ton modèle...

Avatar
Jc Sirot
Olivier Savoie wrote:
Bonjour,
- mon interface graphique Swing comprend une JTable dans un scrollPane.

- J'ai cree une classe MonModel qui etend AbstractTableModel.
ce model est en charge de synchroniser les donnees avec la JTable via
une methode update
qui genere un evenement pour signaler les changements.

- Les changements sont
- update des donnees
- modification du nombre de lignes

- Les donnees sont contenus dans un Vecteur de Vecteur dans mon model.
Celui-ci est
correctement mis a jour lors des update.

-Mon probleme est Lorsque je genere un event, les donnees sont ajoutes a
la fin de la table et non pas
par dessus les donnees existantes.



La façon dont les éléments sont affichés dans une JTable (par exe mple
l'ordre de ces éléments) dépend de la méthode getValueAt de l'int erface
TableModel. Si tu veux que les nouvelles valeurs apparaissent en premier
dans la table, il faut que getValueAt renvoie ces valeurs pour les index
des premières lignes de la table.

Par exemple :

class MonModel extends AbstractTableModel
{
Vector data;

public void insert(Vector newValue)
{
/* on insère la nouvelle valeur en 1ere position
* dans la table pour que cette valeur soit utilisée
* quand getValueAt récupère les objets sur la ligne 0
*/
data.add(0, newValue);
update(); // lance les evts pour forcer le rafraichissement
}

public Object getValueAt(int row, int col)
{
return ((Vector)data.get(row)).get(col);
}
}
--

Cordialement
-- JC Sirot