Editer des données affiché sur un JTable [Résolu]

alia_2006 4 Messages postés mercredi 24 mai 2006Date d'inscription 11 juin 2006 Dernière intervention - 26 mai 2006 à 19:16 - Dernière réponse : alia_2006 4 Messages postés mercredi 24 mai 2006Date d'inscription 11 juin 2006 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

5 réponses

cs_RedDog 50 Messages postés lundi 7 avril 2003Date d'inscription 21 août 2013 Dernière intervention - 2 juin 2006 à 06:41
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_RedDog
scaryman 492 Messages postés vendredi 30 janvier 2004Date d'inscription 16 mai 2007 Dernière intervention - 26 mai 2006 à 19:33
0
Utile
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++
Commenter la réponse de scaryman
cs_RedDog 50 Messages postés lundi 7 avril 2003Date d'inscription 21 août 2013 Dernière intervention - 27 mai 2006 à 06:30
0
Utile
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à!
Commenter la réponse de cs_RedDog
alia_2006 4 Messages postés mercredi 24 mai 2006Date d'inscription 11 juin 2006 Dernière intervention - 1 juin 2006 à 19:54
0
Utile
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
Commenter la réponse de alia_2006
alia_2006 4 Messages postés mercredi 24 mai 2006Date d'inscription 11 juin 2006 Dernière intervention - 11 juin 2006 à 18:26
0
Utile
Salut,
Le problème est résolu. Merci beaucoup pour votre aide.
Commenter la réponse de alia_2006

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.