Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2961 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [swing] problème de TableModelListener

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[swing] problème de TableModelListener

n°1240732
psychotek
Posté le 07-11-2005 à 19:49:48  profilanswer
 

Bonjour à tous
 
je cherche à implémenter une JTable, écoutée par mon propre TableModelListener. Pour cela j'ai une classe AtmTableModel, qui hérite de AbstractTableModel, et qui implémente TableModelListener.
mais plutôt qu'un long discours, voici le code :

Code :
  1. package atmgui;
  2. import javax.swing.table.AbstractTableModel;
  3. import main.AllTaskManager;
  4. import javax.swing.event.TableModelListener;
  5. import javax.swing.event.TableModelEvent;
  6. @SuppressWarnings("serial" )
  7. public class AtmTableModel extends AbstractTableModel implements
  8.  TableModelListener {
  9. private Object[][] _data;
  10. private String[] _columnNames;
  11. private AllTaskManager _atm;
  12. public AtmTableModel(AllTaskManager atm) {
  13.  super();
  14.  _data = atm.getData();
  15.  _columnNames = atm.getColumnNames();
  16.  _atm = atm;
  17.  addTableModelListener(this);
  18. }
  19. public int getRowCount() {
  20.  return _data.length;
  21. }
  22. public int getColumnCount() {
  23.  return _columnNames.length;
  24. }
  25. public Object getValueAt(int row, int col) {
  26.  return _data[row][col];
  27. }
  28. public String getColumnName(int col) {
  29.  return _columnNames[col];
  30. }
  31. public boolean isCellEditable(int row, int col) {
  32.  return true;
  33. }
  34. public void contentChanged() {
  35.  _data = _atm.getData();
  36.  fireTableRowsInserted(getRowCount(), getRowCount());
  37. }
  38. public void tableChanged(TableModelEvent e) {
  39.  System.out.println("tableChanged" );
  40.  int row = e.getFirstRow();
  41.  int column = e.getColumn();
  42.  if (e.getType() == TableModelEvent.UPDATE)
  43.   _atm.changeTask(this, row, column, getValueAt(row, column));
  44.  else
  45.   return;
  46. }
  47. public String toString() {
  48.  String result = "Value of data:\n";
  49.  for (int i = 0; i < getRowCount(); i++) {
  50.   result += "    row " + i + ":";
  51.   for (int j = 0; j < getColumnCount(); j++)
  52.    result += "  " + getValueAt(i, j);
  53.   result += "\n";
  54.  }
  55.  return result += "--------------------------";
  56. }
  57. }


 
mon but premier est d'attrapper une modification faite dans la table par l'utilisateur, lors de l'exécution du programme.
MAIS VOILA, ça ne marche pas. je pensais pourtant avoir tout bien fait comme il faut, comme dans le how to de sun.
quelqu'un sait d'où vient le problème ?
 
merci

mood
Publicité
Posté le 07-11-2005 à 19:49:48  profilanswer
 

n°1241004
nerisson
Pic-pic
Posté le 08-11-2005 à 08:56:48  profilanswer
 

As tu bien enregistré ton listener sur ta table ?


---------------
Light is right
n°1241211
psychotek
Posté le 08-11-2005 à 14:00:22  profilanswer
 

dans le constructeur, il y a " addTableModelListener(this); "
cela ne suffit pas ?

n°1241418
Trollable
Posté le 08-11-2005 à 16:47:35  profilanswer
 

ca, c'est louche:

Code :
  1. fireTableRowsInserted(getRowCount(), getRowCount());


---------------
The Million Dollar Screenshot  (seo v7ndotcom elursrebmem paesys wifi)
n°1241475
psychotek
Posté le 08-11-2005 à 17:43:21  profilanswer
 

pourquoi est-ce louche ?
sans ça, la JTable qui utilise le modele n'est pas prévenue de l'insertion d'une nouvelle ligne dans le modele. nan ?
en fait je débute en swing.

n°1241934
psychotek
Posté le 09-11-2005 à 07:20:17  profilanswer
 

up :-/

n°1243191
psychotek
Posté le 10-11-2005 à 14:26:48  profilanswer
 

up :-(

n°1243694
chicotruss
Posté le 10-11-2005 à 23:52:57  profilanswer
 

psychotek a écrit :

pourquoi est-ce louche ?
sans ça, la JTable qui utilise le modele n'est pas prévenue de l'insertion d'une nouvelle ligne dans le modele. nan ?
en fait je débute en swing.


 
Salut,
ce qui est surtout louche, c'est que tu appelle avec getRowCount() en parametre or:
 

Citation :

public void fireTableRowsInserted(int firstRow, int lastRow)
 
    Notifies all listeners that rows in the range [firstRow, lastRow], inclusive, have been inserted.


 
et les index des lignes de ta table vont de 0 à getRowCount() -1.
 
Je pense donc que ton modèle n'est jamais prévenu puisque cette ligne n'existe pas.
Tu devrais donc essayer de faire tes appels ainsi:

Code :
  1. fireTableRowsInserted(0, getRowCount() -1);


 
 
Si ça ne solutionne pas le problème, moi je ferais plutot comme ca:
 
Utiliser un DefaultTableModel à la place d'un AbstractTableModel qui n'est pas une classe abstraite: donc tu n'as pas besoin de gérer les notifications de changement (fireTableRows****), c'est déja fait.
 

Citation :

mon but premier est d'attrapper une modification faite dans la table par l'utilisateur, lors de l'exécution du programme


 
Ensuite, la JTable répercute automatiquement les changements sur le DefaultTableModel donc si l'utilisateur change une valeur, ajoute des lignes, etc. le modèle est automatiquement mis à jour. Tu n'as donc plus qu'à interroger le modèle suite à un changement:
 

Code :
  1. AllTaskManager atm = new AllTaskManager(/* tes paramètres */);
  2. DefaultTableModel dtm = new DefaultTableModel(atm) {
  3.      private AllTaskManager _atm = null;
  4.      public DefaultTableModel(AllTaskManager atm) throwsNullPointerException {
  5.           if(atm == null)
  6.                throw(new NullPointerException("ATM IS NULL" ));
  7.           _atm = atm;
  8.           // appel du constructeur avec Object[][] et Object[]
  9.           this(atm.getData(), atm.getColumnNames());
  10.           addTableModelListener(
  11.                 new TableModelListener() {
  12.                      public void tableChanged(TableModelEvent tme) {
  13.                           // ici tu mets le même code que ce que tu avais
  14.                      }
  15.                 }
  16.           );
  17.      }
  18.      public String toString() {
  19.           // ici pareil, tu remets ton code
  20.      }
  21.      // et ainsi de suite, tu redefinis seulement les méthodes dont tu as besoin.
  22. };


 

n°1243949
psychotek
Posté le 11-11-2005 à 17:30:33  profilanswer
 

merci pour ta réponse. je vais essayer ce que tu conseilles, dès que le cvs de sourceforge sera reparti (parce que là j'ai un timeout, c'est pénible)

n°1244180
psychotek
Posté le 12-11-2005 à 11:30:14  profilanswer
 

booon, super, finalement mon AtmTableModel dérive de DefaultTableModel, et effectivement ça marche, tout est bien géré. merci à toi.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [swing] problème de TableModelListener

 

Sujets relatifs
Probleme d'alignement verttical.Problème avec sscanf
[CSS] Problème de cadre en CSSProbleme de references
Probleme Access: assistant création formulaire ne détecte pas de champProbleme de répertoire
probleme entre script et GIF animesproblème de migration sur 1and1
probleme programmationPetit problème avec mon design css
Plus de sujets relatifs à : [swing] problème de TableModelListener


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR