Utiliser l'état d'une case à cocher dans une JTable pour faire une requette SQL

baratribord Messages postés 44 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 30 mai 2008 - 15 mai 2008 à 16:10
baratribord Messages postés 44 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 30 mai 2008 - 15 mai 2008 à 17:50
/* j'ai mis également ce message dans la partie débutant ayant repris la programmation après un long moment d'arrêt sans doute ce message est mieux içi...*/



Bonjour,

J'ai écrit un programme qui lit les informations d'une base de données MySql et qui les affichent dans une JTable.
A
cette JTable j'ai rajouté une case à cocher au bout de chaque ligne
pour spécifier l'effacement des enregistrements selectionnés.
Le
problème c'est que je ne sais comment accéder aux informations de ma
table, ni comment les stocker pour générer ma requette SQL à partir du
pseudo se trouvant dans la table des lignes selectionnées.

Mon plus gros problème se situe au niveau de l'utilisation des collections où un code comme celui-çi     protected List<Object[]> rowValues_ = new ArrayList<Object[]>();
; m'est vraiment trop barbare, enfin je n'arrive pas à l'exploiter sortie du contexte.

Je vous joins une partie du code pour situer donc le contexte :

                        // Chargement de mon pilote
                        Class.forName(pilote);
                        Connection connexion = DriverManager.getConnection("jdbc:mysql://localhost/mabase", "root", "toto");
                        Statement instruction = connexion.createStatement();
                        sql = "SELECT * FROM data";
                        ResultSet resultat = instruction.executeQuery(sql);
                        ResultSetTableModel tableModel = new ResultSetTableModel();
                        tableModel.updateModel(resultat);
                        JTable table = new JTable(tableModel);
                        JScrollPane JSP = new JScrollPane(table);
                        Fen.getContentPane().add(JSP,BorderLayout.CENTER);
                        Fen.pan.add(Fen.supp);//Affichage du bouton supprimer
                        Fen.validate();

class ResultSetTableModel extends AbstractTableModel {
  protected String[] columnNames_ = {};
  protected int columnCount_ = 0;
  protected Class[] columnClasses_ = {};

  /**
   * Une liste pour stocker chaque ligne de valeurs.
   * Chaque ligne sera elle même représentée par un tableau d'Object.
   */
  protected List<Object[]> rowValues_ = new ArrayList<Object[]>();

  /**
   * les meta données du resultset représenté par ce TableModel
   */
  protected ResultSetMetaData metaData_;
  protected boolean editable_ = true;

  public void updateModel(ResultSet rs) throws SQLException {

    metaData_ = rs.getMetaData();
    columnCount_ = metaData_.getColumnCount()+1;//+1 pour indiquer un élément de plus (lacase à cocher)
   
    // allocation des tableaux pour stocker les noms des colonnes
    // et le type (classes) des colonnes
    columnNames_ = new String[columnCount_];
    columnClasses_ = new Class[columnCount_];
    int i; 
    for ( i = 1; i <= columnCount_-1;  i++) {
      columnNames_[i-1] = metaData_.getColumnName(i);
      try {
    columnClasses_[i-1] = Class.forName(metaData_.getColumnClassName(i));
      }
      catch (ClassNotFoundException clnfe) {
        // normalement ce type d'exception ne devrait jamais être lancé
    clnfe.printStackTrace();
    System.exit(0);
      }
    }
    columnNames_[i-1]="Supprimer";
    columnClasses_[i-1] = Boolean.class;
   
    // chargement des données dans la liste rowValues
    // initialisation de la liste des lignes avec une liste vide
    rowValues_ = new ArrayList<Object[]>();
   
    // récuperation de chacune des lignes du ResultSet
    while (rs.next()) {
      //création d'un tableau d'objets pour récupérer les données d'une ligne
      Object[] values = new Object[columnCount_+1-1];//+1
      // recopie des valeurs de la ligne dans le tableau
      for ( i = 1; i <= columnCount_-1; i++)
    values[i-1] = rs.getObject(i);
      // ajout du tableau à la liste des lignes
      values[i-1] =true;//initialisation de la case à cocher
      rowValues_.add(values);
    }
  
    fireTableStructureChanged();
  }

 
  public void setEditable(boolean edit) {
    editable_ = edit;
  }

  //-----------------------------------------------------
  // rédéfinitions des méthodes de l'interface TableModel
  //-----------------------------------------------------

 
  public boolean isEditable() {
    return editable_;
  }

  public int getColumnCount() {
    return columnCount_;
  }

  public int getRowCount() {
    return rowValues_.size();
  }

  public String getColumnName(int col) {
    return columnNames_[col];
  }

  public Class getColumnClass(int col) {
    return columnClasses_[col];
  }

  public Object getValueAt(int row, int col) {
     if (col == 11)
     {
         //values[row]=false;
         //rowValues_.add(values);
     }
    return ((Object[]) (rowValues_.get(row)))[col];
  }

  public boolean isCellEditable(int row, int column) {
        try {
                return editable_ && metaData_.isWritable(column+1);
        }
        catch (SQLException e) {
            return true;//si false on ne peut pas changer le statut de la case à cocher
        }
  }

   public void setValueAt(Object value, int row, int column) {
      Object[] dataRow = (Object []) rowValues_.get(row);
        dataRow[column] = value;
     
    }
}

En vous remerciant.
Bara

1 réponse

baratribord Messages postés 44 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 30 mai 2008
15 mai 2008 à 17:50
Bon j'ai avancé un peu. Peut être pas dans la bonne direction...
Je récupère mon ArrayList dans un endroit où je peux presque l'exploiter.

List<Object[]> rowValues_=tableModel.updateModel(resultat);

public List<Object[]> updateModel(ResultSet rs) throws SQLException {
.....

return rowValues_;
}

ma question : comment je fais pour parcourir mon nouveau rowValues ?
suis-je dans une bonne démarche ?
0
Rejoignez-nous