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

 Java Discussion :

Problème mise en place TableModelListener


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiante
    Inscrit en
    Mars 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiante

    Informations forums :
    Inscription : Mars 2019
    Messages : 4
    Par défaut Problème mise en place TableModelListener
    Bonjour,

    Je suis débutante et je tente de mettre un TableModelListener sur un Jtable pour pouvoir mettre à jour le tableau lorsqu'on ajoute un item en cliquant sur un bouton.
    Tout ce que je réussis à faire est de générer un nouveau tableau après l'insertion du nouvel item! Il y a certainement un autre moyen de le faire.
    J'ai vu un exemple avec updateUI() sur la table, mais je n'arrive pas à le reproduire.
    J'ai compris qu'avec un TableModelListener, il faut une méthode du genre «ajouter le nouvel item à la liste» puis applique la méthode fireTableDataChanged() sur le modèle de la table... mais je n'y arrive pas! Il y a toujours ce message que je ne peux pas mettre une méthode non-statique dans la méthode du ActionListener du bouton.
    Qu'est-ce que je n'ai pas compris?
    Où est mon erreur?
    J'ai tenté de faire un exemple au plus simple (même si ça fait pas mal de code!) que je joint ici.


    Merci d'avance!

    Mireille

    Ici, la classe de la JTable et du modèle.

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
     
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import java.awt.Dimension;
    import javax.swing.JPanel;
    import javax.swing.event.TableModelEvent;
    import javax.swing.event.TableModelListener;
    import javax.swing.table.AbstractTableModel;
     
     
    public class Table extends JPanel {
     
      private JTable table;
      private ModeleTable model;
     
     
      public Table(){  
        super();
        table = new JTable();
        model = new ModeleTable();
        table.setModel(model);
        table.setPreferredScrollableViewportSize(new Dimension(300, 100));
        table.setFillsViewportHeight(true); // à quoi ca sert???
     
        table.getModel().addTableModelListener(new TableModelListener() {
          @Override
          public void tableChanged(TableModelEvent event) {
             System.out.println(event);
     
          }
        });
     
        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane);
        }
     
      public void update() {
        model.fireTableDataChanged();
        //table.updateUI();
        }
     
      public ModeleTable getModel() {
        return model;
      }
     
       public JTable getTable() {
        return table;
      }
     
    }
     
     
     
     class ModeleTable extends AbstractTableModel {
     
      private boolean DEBUG = false;
      private final String TITRE = "<html><b>Saluation</b></html>";
     
     
      @Override
      public int getRowCount() {
        return Test.getList().size();
      }
     
      @Override
      public int getColumnCount() {
        return 1;
      }
     
      @Override
      public String getColumnName(int column) {
          if(column == 0) {
            return TITRE;
          } else {
              return "erreur";
          }
      }
     
      @Override
      public Object getValueAt(int rowIndex, int columnIndex) { 
        switch (columnIndex) {
          case 0:
            return Test.getList().get(rowIndex);
          default:
            return Test.getList().get(rowIndex);
        }
      } 
     
      @Override
      public void setValueAt(Object value, int rowIndex, int columnIndex) {
        switch (columnIndex) {
          case 0:
            Test.getList().get(rowIndex);   
            break;
          default:
            Test.getList().get(rowIndex);
            break;
        }
        fireTableRowsUpdated(rowIndex, columnIndex);
      }
     
    }
    Et ici la classe de test.

    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
     
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public class Test {
     
      private static ArrayList<String> list;
      private JPanel panelTable;
      private JPanel panelAjout;
     
      public Test() {
       createGui(); 
      }
     
      public void createGui() {
        list = new ArrayList<>();
        list.add("Allo");
        list.add("Bonjour");
        list.add("Salut");
     
     
        JFrame frame = new JFrame();
        panelTable = new Table();
        panelAjout = new JPanel();
     
        JButton bouton = new JButton("Ajouter");   
        bouton.addActionListener(new ActionListener(){  
          @Override
          public void actionPerformed(ActionEvent event){   
            System.out.println("ajout - Hi!");
            list.add("Hi!");
            //Table.update();
           frame.remove(panelTable);
           frame.add(new Table());
           frame.revalidate();
          }
        });    
        panelAjout.add(bouton);
     
     
        frame.add(panelTable, BorderLayout.NORTH);
        frame.add(panelAjout);
     
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Test table update");    
        frame.setBounds (200, 150, 500, 500);    
        frame.setVisible(true);
      }
     
      public static ArrayList<String> getList() {
        return list;
      }
     
      public static void main(String[] params) {
        Test test = new Test();
      }
     
    }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Le plus simple est d'utiliser un DefaultTableModel et de convertir ta List en Vector, ou de t'inspirer (voire copier) du source de cette classe en remplaçant Vector par List. Tout est déjà géré pour toi (il suffit d'appeler addRow pour ajouter une ligne dans la table).

    Pour adapter rapidement le code que tu as déjà fait, le plus simple est et d'ajouter une méthode addRow et
    d'avoir d'avoir une variable de type List en attribut interne d'une classe étendant AbstractTableModel, plutôt qu'un accès static à une variable externe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void addRow(String item) {
        int size = list.size(); // la taille actuelle correspond à la position de la nouvelle String dans la liste après ajout
        list.add(item);
        fireTableRowsInserted(size,size); // indique qu'on a ajouté une nouvelle ligne à la position size
    }
    Tu as un petit résumé sur l'utilisation des méthodes de type fireXXXX ici.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. [eXo Portal] Problème mise en place ETag
    Par toutounes dans le forum Portails
    Réponses: 1
    Dernier message: 16/03/2013, 13h02
  2. [PL7-3] Problème mise en place réseau Fipway
    Par Fr33dom dans le forum Automation
    Réponses: 1
    Dernier message: 02/03/2010, 16h29
  3. classe Permission. problème mise en place
    Par storm_2000 dans le forum Sécurité
    Réponses: 0
    Dernier message: 25/09/2008, 22h29
  4. Problème mise en place Apache avec mod_ssl
    Par Le fut dans le forum Apache
    Réponses: 3
    Dernier message: 19/12/2006, 14h04

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