3 votes

Comment mettre à jour les lignes d'un DefaultTableModel dans un JTable ?

Ok, j'ai ce tableau ajouté à un JPanel ajouté à une JFrame.

Dans l'événement mousePressed, il crée une nouvelle classe tData et appelle une méthode qui renvoie les données de la base de données sous la forme d'une chaîne de caractères contenue dans un élément vectoriel.

Ce que je veux, c'est qu'à chaque fois que l'on appuie sur le bouton, le tableau soit mis à jour,

Ce qui se passe, c'est qu'à chaque fois que l'on appuie sur le bouton, le tableau est mis à jour mais les mêmes données sont ajoutées à la fin du tableau.

Quelle en est la cause ?

    Object columnHeaders[] = {"Fname", "Mname", "Lname", "Age"};
    Object data[][] = {{}};
    final DefaultTableModel dtm = new DefaultTableModel(data, columnHeaders);

    JTable tb = new JTable(dtm);
    JScrollPane scrollPane = new JScrollPane(tb);

    tableWrap.add(scrollPane);

    btn.addMouseListener(new MouseAdapter() {

        @Override 
        public void mousePressed(MouseEvent arg0) {
            tData h = new tData(10));
            Vector<String> v = h.getInfo();
            for(int i = 0; i < v.size() ; i++) {
                dtm.insertRow(i, new Object[]{v.get(i).split(",")[0], v.get(i).split(",")[1], v.get(i).split(",")[2], v.get(i).split(",")[3]});
            }

            dtm.fireTableDataChanged();
            frame.repaint();
        }
    });

4voto

Guillaume Polet Points 31933

Plusieurs questions se posent ici :

  1. Il semble que vous deviez mettre à jour l'ensemble du tableau chaque fois que vous appuyez sur ce bouton. Trois options s'offrent à vous : mettre à jour le DefaultTableModel à l'aide de la fonction setDataVector recréer un nouveau modèle à partir de zéro et le placer sur la table JT avec setModel , de mettre en œuvre votre propre TableModel sur la base de AbstractTableModel et de déclencher les événements TableModel appropriés. Vous pouvez également mettre à jour le modèle en utilisant addRow y removeRow mais cela serait très inefficace car cela déclencherait de nombreux événements.

  2. Pour écouter les événements "bouton enfoncé", plutôt que d'utiliser une fonction ActionListener (et l'ajouter en utilisant addActionListener ) ou une action (et la définir avec setAction ).

  3. Dans DefaultTableModel, lorsque vous modifiez la structure, il n'est pas nécessaire d'appeler manuellement fireTableDataChanged(); . Il déclenche automatiquement les événements TableModel appropriés lorsque vous modifiez les données sous-jacentes. N'appelez pas frame.repaint() soit, elle est inutile et peut prendre du temps.

  4. Sans rapport : Considérez les éléments suivants Conventions de codage Java (le nom de la classe commence par une majuscule) et des noms de variables significatifs.

1voto

Scott Faria Points 260

Le code que vous avez écrit ici pose un certain nombre de problèmes. Tout d'abord, abordons le problème que vous rencontrez avec le code de votre méthode mousePressed :

Vous obtenez un vecteur à partir de votre code de fourniture de données, puis vous définissez les lignes 0...n de la table avec vos nouvelles données. La façon de procéder est d'écrire un extension personnalisée de AbstractTableModel qui renvoie les données dont vous avez besoin lorsque vous appuyez sur le bouton.

Un autre problème est la façon dont vous gérez l'appui sur le bouton. L'ajout d'un récepteur de souris au bouton n'est absolument pas la bonne façon de gérer cela. Vous devez ajouter un ActionListener au bouton. Cet écouteur sera activé chaque fois que le bouton sera pressé et relâché.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X