IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

[JTable] suppression d'une ligne dans un JTable?


Sujet :

Composants Java

  1. #1
    hby
    hby est déconnecté
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Février 2006
    Messages : 35
    Points : 22
    Points
    22
    Par défaut [JTable] suppression d'une ligne dans un JTable?
    bonjour tous le monde

    g un gros probleme avec JTable je vous mets un peu dans le bain:

    je suis en train de charger le contenu d'un fichier texte dans un JTable
    mon JTable se base sur un modele que g crée.

    au fait je veux selectionner une ligne du tablo et appuyer sur un bouton DELETE et apres reafficher le nvo tablo qui ne contient plus cette ligne

    g essayé plein de trucs mais ca marche po
    et en plus ca me sort bcp d'exceptions

    AIDEZ MOI SVP snnnnnnnnnnnnnnnnnnnifffffffffffffffffffffff !!!!!!!!

  2. #2
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Tu dois implementer ta méthode "deleteLine()" dans ton TableModel, ensuite, après le click sur le bouton, faudra raffraichir la table.

  3. #3
    hby
    hby est déconnecté
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Février 2006
    Messages : 35
    Points : 22
    Points
    22
    Par défaut
    merci pour ta reponse
    je vais essayer ca et je te tiens au courant
    merci encore

  4. #4
    hby
    hby est déconnecté
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Février 2006
    Messages : 35
    Points : 22
    Points
    22
    Par défaut
    bonjour
    g essayé ce que vs m avez dit de faire mais ca marche po
    g voulu faire avec removeRow(int n) et c pareil
    mais qque je dois faire pr que ca marche ??????
    y a til des exemples sur lesquels je peux me documenter??
    plz help me

  5. #5
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Bonjour,
    je suppose que le JTable utilise un DefaultTableModel. Dans ce cas, removeRow(int i) devrait marcher à merveille. Le rafraichissement sera automatique.

    Quelles erreurs obtiens-tu ?

  6. #6
    hby
    hby est déconnecté
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Février 2006
    Messages : 35
    Points : 22
    Points
    22
    Par défaut
    re
    justement JTable utilise un autre model que g implementé.
    la table est generée a partir d'un fichier texte au moment de l'execution
    en plus la methode getSelectedRow ne marche po et me sort un NullPointerException
    que dois je faire?????????

  7. #7
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Le minimum, ça serait qu'au moins ton TableModel étende AbstractTableModel. Comme ça, tu pourrais écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void deleteRow(int i) {
     
      // effacer la ligne de la structure de données
      ...
      super.fireTableRowsDeleted(i, i);
    }
    Pour la NullPointerException, si on pouvait voir la trace complète, ça aiderait.

  8. #8
    hby
    hby est déconnecté
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Février 2006
    Messages : 35
    Points : 22
    Points
    22
    Par défaut
    re
    bon voici mon model
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    public class DataFileTableModel extends AbstractTableModel{
             protected Vector data;            //données
             protected Vector columnNames ;    //noms de colonnes
             protected String datafile;        //nom du fichier de données
     
             public DataFileTableModel(String f) {
              datafile=f;
              initVectors();
             }
     
             public void initVectors() {
              String ligne;
              data=new Vector();
              columnNames=new Vector();
              try {
               FileInputStream fin=new FileInputStream(datafile);
               BufferedReader br=new BufferedReader(
                new InputStreamReader(fin));
               // lecture des noms de colonnes (1ère ligne)
               ligne=br.readLine();
               StringTokenizer st1=new StringTokenizer(ligne, "#");
               while(st1.hasMoreTokens())
                columnNames.addElement(st1.nextToken());
               // lecture des données
               while ((ligne = br.readLine()) != null) {
                StringTokenizer st2=new StringTokenizer(ligne, "#");
                while(st2.hasMoreTokens())
                 data.addElement(st2.nextToken());
                }
               br.close();
              } catch (Exception e) {
               e.printStackTrace();
              }
             }
             public int getColumnCount() {
             return columnNames.size();
             }
             public int getRowCount() {
              return data.size()/getColumnCount();
             }
     
             public String getColumnName(int columnIndex) {
              String colName="";
              if (columnIndex<=getColumnCount())
               colName=(String)columnNames.elementAt(columnIndex);
              return colName;
             }
            public Class getColumnClass(int columnIndex){
              return String.class;
             }
             public boolean isCellEditable(int rowIndex, int columnIndex) {
              return true;
             }
     
     
             public Object getValueAt(int rowIndex, int columnIndex) {
              return (String)data.elementAt(
                       (rowIndex*getColumnCount())+columnIndex);
             }
             public void deleteRow(int i) { 
     
               // effacer la ligne de la structure de données 
     
               super.fireTableRowsDeleted(i, i); 
    }
     
       }
    voila ou je fais la suppression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
     void jButton2_actionPerformed(ActionEvent e) {
     
        Vector vv=new Vector();
           int n;
           int i=0;
           DefaultTableModel model=(DefaultTableModel) tablo.table.getModel();
           try{
           System.out.println(tablo.table.getSelectedRow());
           if((n=(tablo.table.getSelectedRow()))!=-1)//il peut me renvoyer -1 = aucune ligne selectionnée
           {
            vv=(Vector)vD.elementAt(n); // je met la ligne num n dans le vector vv
     
            // vD.remove(n);
     
     
     
             //DataFileTable tablo=new DataFileTable("d:\\FichierTest.txt",vD,vC);
     
               //this.getContentPane().add(tablo,new XYConstraints(71, 202, 442, 128));
               //tablo.setBackground(SystemColor.desktop);
               //tablo.setVisible(true);
               SwingUtilities.updateComponentTreeUI(this);
     
     
     
     
     
           }
         }
         catch(java.lang.NullPointerException ec){
           ec.toString();
           System.out.println("je suis la");
              }
     
     
     
           }
     
     
     
     
      }
    et voici le tablo sur lequel je trvaille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    public class DataFileTable extends JPanel{
      public JTable table;
      public DataFileTable(String dataFilePath) {
        //JTable table;                // le tableau
        DataFileTableModel model; // le modèle
        //fonte
        Font f = new Font("SanSerif", Font.PLAIN, 24);
        setFont(f);
        //gestionnaire de positionnement
        setLayout(new BorderLayout());
        //construction du modèle de remplissage à partir du fichier
        model = new DataFileTableModel(dataFilePath);
        //création du tableau
        table = new JTable();
     
        table.setModel(model);
     
        table.createDefaultColumnsFromModel();
        //scroller
        JScrollPane scrollpane = new JScrollPane(table);
        //scrollpane.add(chec);
        add(scrollpane);
      }
     
      public DataFileTable(String path, Vector vD, Vector vC) {
        JTable table = new JTable(vD, vC);
        /*for(int i=0;i<vD.size();i++){
             }*/
     
        Font f = new Font("SanSerif", Font.PLAIN, 24);
        setFont(f);
        setLayout(new BorderLayout());
        JScrollPane scrollpane = new JScrollPane(table);
        add(scrollpane);
     
      }
     
      public Dimension getPreferredSize() {
     
        return new Dimension(400, 300);
      }
     
     
    }
     
           class WindowCloser extends WindowAdapter {
                    public void windowClosing(WindowEvent e) {
                     Window win=e.getWindow();
                     //effacer la fenêtre
                     win.setVisible(false);
                     //terminer le programme
                     System.exit(0);
                    }
                   }

  9. #9
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Ok, alors d'après ton code, la méthode pour détruire une ligne devrait ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void deleteRow(int rowIndex) {
     
      int first = rowIndex * getColumnCount();
      int last = first + getColumnCount();
     
      data.removeRange(first, last);
     
      super.fireTableRowsDeleted(rowIndex, rowIndex);
    }
    Et pour l'appeler, il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void jButton2_actionPerformed(ActionEvent e) {
     
      int selectedRow = tablo.table.getSelectedRow();
      if(selectedRow != -1) {
        DataFileTableModel model = (DataFileTableModel) tablo.table.getModel();
        model.deleteRow(selectedRow);
      }
    }

  10. #10
    hby
    hby est déconnecté
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Février 2006
    Messages : 35
    Points : 22
    Points
    22
    Par défaut
    merci pour ta reponse g fait comme tu m as dit mais
    ca me genere des exceptions et voici la trace
    au fait c getSelectedRow qui me sort ces excerptions
    ********************************************
    java.lang.NullPointerException

    at interfac.Search.jButton2_actionPerformed(Search.java:278)

    at interfac.Search_jButton2_actionAdapter.actionPerformed(Search.java:340)

    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786)

    at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1839)

    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)

    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)

    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:245)

    at java.awt.Component.processMouseEvent(Component.java:5100)

    at java.awt.Component.processEvent(Component.java:4897)

    at java.awt.Container.processEvent(Container.java:1569)

    at java.awt.Component.dispatchEventImpl(Component.java:3615)

    at java.awt.Container.dispatchEventImpl(Container.java:1627)

    at java.awt.Component.dispatchEvent(Component.java:3477)

    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483)

    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)

    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)

    at java.awt.Container.dispatchEventImpl(Container.java:1613)

    at java.awt.Window.dispatchEventImpl(Window.java:1606)

    at java.awt.Component.dispatchEvent(Component.java:3477)

    at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)

    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)

    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)

    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)

    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)

    at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)

    *********************************************************[/code]

  11. #11
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Alors c'est qu'une des variables tablo ou tablo.table est null, surement parce qu'elle n'est pas initialisée. Il faut que tu vérifies tes références.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    bonjour

    j'ai eu la chance de lire votre discussion qui franchement m'a un peu aider à comprendre le fonctionnement de ce composant qui sera le sujet de mon prochain exposé Java, étant qu'une debutante dans ce langage que je trouve trop passionnant, je rencontre tjrs des problèmes, je sais d'avance que vous allez surment trouver ma question banale mais je la pose qd même :
    d'après ce que j'ai pu lire sur ce forum j'ai pu comprendre qu'on est obligé de travailler avec la classe DataFileTableModel qui utilise les données contenues dans un fichier et c'est là ou je me bloque, je vois pas comment je devrais construire le fichier qui va contenir les données, en plus comment dois-je écrire les données c'est à dire: si je prens par exemple le code écrit dans cette discussion, de quelle façon dois-je mettre les données???

    merci d'avance

    cordialement
    fadoua

  13. #13
    Membre confirmé Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Points : 554
    Points
    554
    Par défaut
    Citation Envoyé par fadoua_22
    d'après ce que j'ai pu lire sur ce forum j'ai pu comprendre qu'on est obligé de travailler avec la classe DataFileTableModel qui utilise les données contenues dans un fichier et c'est là ou je me bloque, je vois pas comment je devrais construire le fichier qui va contenir les données, en plus comment dois-je écrire les données c'est à dire: si je prens par exemple le code écrit dans cette discussion, de quelle façon dois-je mettre les données???


    Non... tu utilises un fichier contenant des données si tes données sont dans un fichier... C'était apparemment le cas pour la personne qui a créée ce post, mais ca n'est pas forcément le cas pour tout le monde ! Tes données peuvent être stockées dans un objet Java ou autre ! Tu dois juste implémenter une classe qui hérite AbstractTableModel (ou qui implémente TableModel) et redéfinir les méthodes en renvoyant les données que tu veux... données ne provenant pas forcément d'un fichier mais de ce que tu veux...

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    bon, franchement j'ai du mal a comprendre
    bon j explore la situation
    dans mon cas j ai pu créer une fenetre pour telephone (une interface comme skype par exemple) et etant donné que j'ai un onglet que j'ai tituler 'repertoire' (ou on doit normalement trouver les nom et numero de nos contacts) et c'est la ou je veux mettre mon tableau contenant deux colonnes :nom et numéro

    je vois que l'idée du fichier sera bonne dans mon cas, comme ca, je mettrais tous les contacts dedans, ce ke je veux savoir c'est comment dois-je les mettre, dans un site sur internet j'ai pu tourver ça:

    ...
    Nous allons écrire une application qui affichera dans un tableau le contenu d'un fichier de données au format texte utilisant la virgule comme séparateur. La première ligne du fichier donnera les titres des colonnes du tableau.
    ...

    et c'est ce que je comprens pas, je vois vraiment pas de quoi on parle la, est ce un bloc note ou on met les données sous forme de texte avec des virgules??? comme suite:

    nom, numero
    fadoua , 0123456
    nicolas , 97876543
    yihua , 09764322
    ...

    ?????????????

    dsl pour mes questions banales mais la je vois pas du tout comment commencer.

    j ai pu copier un code sur internet que je comprens pas entierement ce qui facilite pas la taches donc ... (si vous voulez jeter un coup d'oeil le voilà:
    http://www.developpez.org/club/bkost...ing/table.html )


    excusez mon ignorance

    merci d'avance.

  15. #15
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Il faut savoir que hby a fait le choix de redéfinir un TableModel à lui. Tu as aussi le choix de créer un DefaultTableModel vide et de lire le fichier pour le remplir (à coups de addRow).

    Si tu veux synchroniser le fichier avec le TableModel (modifier le fichier en même temps que le TableModel), alors c'est peut-être plus intéressant d'utiliser un TableModel personnalisé.

Discussions similaires

  1. Suppression d'une ligne dans JTable
    Par morrissey dans le forum Composants
    Réponses: 1
    Dernier message: 30/01/2010, 19h19
  2. Réponses: 3
    Dernier message: 17/09/2009, 16h26
  3. ajout/suppression d'une ligne dans une jTable
    Par amelA dans le forum Composants
    Réponses: 1
    Dernier message: 16/05/2007, 09h42
  4. [Debutant][JTable] Suppression d'une ligne
    Par seiryujay dans le forum Composants
    Réponses: 7
    Dernier message: 03/08/2005, 18h15
  5. Sélection d'une ligne dans un JTable
    Par dam21 dans le forum Composants
    Réponses: 3
    Dernier message: 28/07/2004, 13h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo