Editer des données affiché sur un JTable

Résolu
alia_2006 Messages postés 4 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 11 juin 2006 - 26 mai 2006 à 19:16
alia_2006 Messages postés 4 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 11 juin 2006 - 11 juin 2006 à 18:26
Salut tous le monde,
j'ai un problème avec le jTable: je veux afficher des données (de la base de données) sous forme editable(pour pouvoir faire un mis à jours des données:update).
les données apparaissent sans soucis mais elles ne sont pas editables. les méthodes offertes par le netbeans (setEditable(true);....) ne marchent plus et je ne sais pas pourquoi??Faut il ajouter un code spéciale dans le modèle pour pouvoir editer les données affichées sur le jTable????
Merci d'avance.

5 réponses

cs_RedDog Messages postés 50 Date d'inscription lundi 7 avril 2003 Statut Membre Dernière intervention 21 août 2013
2 juin 2006 à 06:41
Bonjour,





En effet, je pense aussi que le problème c'est le model.

JTable est assez simple mais il y a des choses qu'on peut faire que par JTable
ou que par le TableModel. insertRow ou addRow par exemple ne sont disponibles
que dans un DefaultTableModel.

Là tu as choisi un AbstractTableModel, donc de faire les méthodes de gestion de
la table par le modèle, par toi-même. Et donc d'avoir un modèle personnalisé à
souhait!


Ce Table marche (j'ai viré les import et le vecteur, ça servait à rien):

public class Table extends javax.swing.table.AbstractTableModel{

   

    /* Variables */

   

    // La variable données doit être remplit en externe.

    // La méthode getValueAt renseignera le TableModel.

    Object donnees[][];

   

    // Contient les en-têtes de colonne
par défaut.

    // La méthode getColumnName renseignera le TableModel.

    String titres[] = {

        "Materiel",

        "Numero
Serie",

        "Statut",

        "Type
de Panne",

        "Temps
de réparation",

        "Description",

        "Prix"
    };

   

    // Contient les classes des
colonnes par défaut.

    // La méthode getColumnClass renseignera le TableModel.

    Class[] types = new
Class[]{

        java.lang.String.class,//Materiel

        java.lang.String.class,//Numero Serie

        java.lang.String.class,//Statut

        java.lang.String.class,//Type de Panne

        java.lang.String.class,//Temps de
réparation

        java.lang.String.class,//Description

        java.lang.String.class//Prix

    };

   

    // Défini si une colonne est
éditable (true) / pas éditable (false)

    // par défaut. La méthode isCellEditable renseignera le
TableModel.

    // Double-cliquer sur la cellule éditable pour modifier une
valeur

    // si sa Class est String par exemple.

    boolean[] canEdit = new boolean[]{

        true,//Materiel

        true,//Numero Serie

        true,//Statut

        true,//Type de Panne

        true,//Temps de réparation

        true,//Description

        true//Prix

    };

   

   

    /* Constructeurs */

   

    /** Crée une Table avec paramètres par
défaut. */

    publicTable()
{

    }

   

    /** Crée une
Table avec données et paramètres par défaut.

*/

    publicTable(Object[][]
donnees) {

        this.donnees
= donnees;

    }

   
    /** Crée une
Table avec données, en redéfinissant pour chaque

     *  colonne, l'en-tête, le type de
Class
et le fait qu'elle

     *  soit ou non éditable.

*/   


    publicTable(Object[][]
donnees, String[] titres,

            Class[]
types, boolean[] canEdit) {

        this.types
= types;

        this.canEdit
= canEdit;

        this .donnees
= donnees;

        this.titres
= titres;

    }

   
    /* Méthodes */
   

    public int getRowCount()
{      
        try{

            return donnees.length;

        }catch(Exception
e){

            return 0;

       
}      

    }

   

    publicintgetColumnCount() {

        try{

            return donnees[0].length;

        }catch(Exception
e){

            return 7;

        }

    }

   

    public Object getValueAt(int param1, int
param2) {

        return
donnees[param1][param2];

    }

   

    public String getColumnName(int col){

        try{

            return titres[col];

        }catch(Exception
e){

            return "Erreur";

        }

    }

   

    public Class getColumnClass(int columnIndex){

        try{

            return types[columnIndex];

        }catch(Exception
e){

            return Object.class;

        }

    }

   

    publicbooleanisCellEditable(int rowIndex, int
columnIndex){

        try{

            return canEdit[columnIndex];

        }catch(Exception
e){

            return false;

        }

    }

   
    /** Ajoute une ligne dans la
Table */
    publicvoidaddRow(Object[] object){

        Object rows[][] = new Object[donnees.length+1][7];

        for(int i= 0;i<donnees.length;i++){

            for (int j =0;j<7;j++){

               
rows[i][j] = donnees[i][j];

           
}           

        }

        for (int k =0;k<7;k++){

           
rows[donnees.length][k] = object[k];

        }

        donnees = rows;

    }

   

}



 




Et maintenant, si on veut faire un petit essai :



 




Object[][] donnees = {
            {"Scie","778546FP","En
stock","Electrique",
            "1 semaines","Scie
Black&Decker","120?"},
            {"Perceuse","956214DE","En
stock","Electrique",
            "1
semaines","Perceuse Bosch","140?"},
            {"Bois","213467TG","Epuisé","Fournisseur",
           
"indéfini","Chêne","à la coupe"}
        };



JTable nouvelleTable = newJTable();
JScrollPane monScrollPane = new JScrollPane(nouvelleTable);
Table monModel = newTable(donnees);
nouvelleTable.setModel(monModel);
Object[]
oj2 = {"1","2","3","4","5","6","7"};
monModel.addRow(oj2);
monScrollPane.setBounds(0,0,500,400);
jPanel7.add(monScrollPane);
 



Voilà!




Vu que je n’ai pas trop commenté, j’espère que tu comprendras
le code.
3
scaryman Messages postés 492 Date d'inscription vendredi 30 janvier 2004 Statut Membre Dernière intervention 16 mai 2007 12
26 mai 2006 à 19:33
Salut
C'est bizarre en effet mais il y a justement un exemple de JTable dont les données proviennet d'un DB dans le jdk :
jdk/demo/jfc/TableExample/src/TableExample.java
Si tu ne t'en sors toujours pas, donne-nous un bout de code pour voir ce qui ne va pas.

A++
0
cs_RedDog Messages postés 50 Date d'inscription lundi 7 avril 2003 Statut Membre Dernière intervention 21 août 2013
27 mai 2006 à 06:30
Salut,
Tu peux configurer ça par le model:

DefaultTableModel dtm = new DefaultTableModel( data[][] ,header[]){
          Class[] types = new Class[]{
                   java.lang.String.class,
                   java.awt.Color.class,
                   java.lang.Boolean.class};
          boolean[] canEdit = newboolean[]{
                   false,
                   true,
                   true};
          public Class getColumnClass(int columnIndex){
                   return types[columnIndex];}
          publicbooleanisCellEditable(int rowIndex, int columnIndex){
                   return canEdit[columnIndex];}
};

table.setModel(dtm);

Voir la doc et le Java Tutorial aussi!
Voilà!
0
alia_2006 Messages postés 4 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 11 juin 2006
1 juin 2006 à 19:54
Salut!
j'ai essayé les solutions proposé mais rien ne change. je met à votre dispostion un bout de code.
Mon Modèle est appelé Table:
<code>
import java.util.Vector;
import javax.swing.table.AbstractTableModel;
public class Table extends AbstractTableModel{
    Object donnees[][];
    String titres[];
   
    protected Vector v;
   
    /** Creates a new instance of Table */
    public Table(Object donnees[][], String titres[]) {
       
        this.donnees = donnees;
        this.titres = titres;
    }
   
    public int getRowCount() {
       
        try{
            return donnees.length;
        }catch(Exception e){
            return 0;
        }
       
    }   
    public int getColumnCount() {
        try{
            return donnees[0].length;
        } catch (Exception e){
            return 7;
        }
       
    }   
    public Object getValueAt(int param1, int param2) {
        return donnees[param1][param2];
    }          
    public String getColumnName(int col){
        try{
            return titres[col];
        }catch(Exception e){
            return "Erreur";
        }
       
    }
}
<code\>
A partir  de la classe BE, je tire les information que je veux mettre dans le jTable de la classe FI
voici le code de la classe BE que j'ai utilisé pour récupérer les données 
<code>
 public void recuperDonneeBE(){
        nomtest=this.jTextField6.getText();//nom technicien
        String argadress=this.jTextField11.getText();///adresse
        String argnomper=this.jTextField12.getText();//nom de personne à contacter
        String argTel=this.jTextField13.getText();//num de tel       
        int tell=Integer.parseInt(argTel);
        String argObs= this.jTextArea1.getText();//l'observation
        int argnumB= val;//numBE       
        //--------->creation d'un bon entree
        befi= new BonEntree(argnumB,identTechnicien,dateaffiche,argObs,argnomper,tell);
        vectBE.addElement(befi);}
 public void recuperDonneeMat(){
        rowSelected = jTable1.getSelectedRow();
        Object objNom = jTable1.getValueAt(rowSelected,0);//nomMateriel
        Object objNum = jTable1.getValueAt(rowSelected,1); //numSerie
        Object objStat = jTable1.getValueAt(rowSelected,2);//nomStatut
        Object objTypPan = jTable1.getValueAt(rowSelected,3);//Type de panne
        Object objObser = jTable1.getValueAt(rowSelected,4);//Observation sur le matériel
        int argnumM=numMat;//numMat
        String nomM = String.valueOf(objNom);
        String numM = String.valueOf(objNum);
        String statM = String.valueOf(objStat);
        String typeM = String.valueOf(objTypPan);
        String observerM = String.valueOf(objObser);
        Object objj=jComboBox1.getSelectedItem();
        codClient=(String)jComboBox2.getSelectedItem();//le code du client
        mfi=new Materiel(argnumM,codT,statM,numM,nomM,typeM,observerM);
        vectMat.addElement(mfi);
    }


<code\>
c'est le constructeur de la classe FI.
<code>
 public FI(BE be)
   
    {    
        constructor=1;
        this.be=be;
        mat=new Materiel();
        bet=new BonEntree();
        tek=new Technicien();
        tek1=new Technicien();
        cl= new Client();
        cl1= new Client();
        nbMat=0;
        String s=null;
        c=new  ConnectionBD();    
        initComponents();        
        this.jButton1.setEnabled(false)  ;
        this.setBounds(50,50,700,550);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        afficheDate();
        affichenum();
             affichDonneeFromBE();
        affTabCombo();
        jTable1.setEditingRow(0);
        jTable1.setSurrendersFocusOnKeystroke(true);
        setVisible(true);
    }
// c'est la méthode qui récupère les données  et les met dans le jTable affiché
public void affichDonneeFromBE(){       
        for(int i=0;i
voila c'est un bout de code que je fais(j'espère qu'il sera suffisant pour expliquer où est le problème.), je crois que le problème c'est que je ne sais pas vraiment comment exploiter mon modèle nommé Table. j'ai besoin d'aide. je me pose toujours la question :est ce que l'utilisation du jTable est difficile comme elle me parait??????????
Remarque: le code de la classe Table est tiré de l'Internet
0

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

Posez votre question
alia_2006 Messages postés 4 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 11 juin 2006
11 juin 2006 à 18:26
Salut,
Le problème est résolu. Merci beaucoup pour votre aide.
0
Rejoignez-nous