[swing] problème de TableModelListener

problème de TableModelListener [swing] - Java - Programmation

Marsh Posté le 07-11-2005 à 19:49:48    

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

Reply

Marsh Posté le 07-11-2005 à 19:49:48   

Reply

Marsh Posté le 08-11-2005 à 08:56:48    

As tu bien enregistré ton listener sur ta table ?


---------------
Light is right
Reply

Marsh Posté le 08-11-2005 à 14:00:22    

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

Reply

Marsh Posté le 08-11-2005 à 16:47:35    

ca, c'est louche:

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


---------------
The Million Dollar Screenshot  (seo v7ndotcom elursrebmem paesys wifi)
Reply

Marsh Posté le 08-11-2005 à 17:43:21    

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.

Reply

Marsh Posté le 09-11-2005 à 07:20:17    

up :-/

Reply

Marsh Posté le 10-11-2005 à 14:26:48    

up :-(

Reply

Marsh Posté le 10-11-2005 à 23:52:57    

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. };


 

Reply

Marsh Posté le 11-11-2005 à 17:30:33    

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)

Reply

Marsh Posté le 12-11-2005 à 11:30:14    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed