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] Tri problème suppression


Sujet :

Composants Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Par défaut [JTable] Tri problème suppression
    Bonjour,

    Je possède dans mon application une JTable sur laquelle j'utilise le tri via TableRowSorter.

    Lorsque je supprime une de mes lignes sans trier, tout fonctionne parfaitement, cela supprime la ligne dans l'affichage et supprime l'élément dans la base de données.
    Lorsque je supprime une de mes lignes en utilisant le tri, ce n'est pas le bon élément qui est supprimé dans l'affichage mais c'est le bon élément qui est supprimé dans ma base de données.
    Donc si je ferme et rouvre ma JTable le problème n'est plus là, je pourrais faire un simple rafraîchissement en somme mais je ne trouve pas ça propre.

    (J'ai cru comprendre que ça venait du fait que lors de la suppression, la taille de mon tableau reste le même avec un élément en moins et le tri s'effectue donc encore sur la taille totale.)

    Merci par avance pour votre aide !

    Voici le code :

    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
     
    		super();
    		setTitle("Liste des clients");
    		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
     
    		modele = new ListeClientsModele();
    		cDAO = new ClientDAO();
    		tableClients = new JTable(modele);
    		tableClients.getColumnModel().getColumn(0).setMinWidth(0);
    		tableClients.getColumnModel().getColumn(0).setMaxWidth(0);
    		getContentPane().add(new JScrollPane(tableClients));
    		tableClients.addMouseListener(new MouseAdapter() {
    			@Override
    			public void mouseClicked(MouseEvent click) {
    				if(click.getClickCount()==1 && click.getButton()==click.BUTTON3)
    				{
    					ligne = tableClients.rowAtPoint(click.getPoint());
    					id = (int) tableClients.getValueAt(ligne, 0);
    					popupMenu.show(tableClients, click.getX(),click.getY());
    				}
    			}
    		});
     
    	    TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tableClients.getModel());
    	    tableClients.setRowSorter(sorter);
    	    sorter.setSortsOnUpdates(true);
    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
    		popupMenu = new JPopupMenu();
    		item = new JMenuItem("Supprimer");
    		item.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent arg0) {
    				try
    				{
    					if(aDesReservEnCours(id) == false)
    					{
    						cDAO.delete(id);
    						afficherMessage("Suppression effectuée avec succès");
    						modele.removeClient(ligne);
    					}
    					else
    					{
    						afficherMessage("Le client a des réservations en cours");
    					}
    				}
    				catch(Exception e)
    				{
    					afficherMessage("Erreur dans la suppression du client.");
    				}
    			}
    		});
    		popupMenu.add(item);

  2. #2
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    tu dois ajouter a la fin de ton remove ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    modele.removeClient(ligne);
    modele.fireTableDataChanged()
    Eric

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Par défaut
    Non ça ne marche pas car je l'ai déjà dans mon modele :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        public void removeClient(int rowIndex) {
        	listeClients.remove(rowIndex);
        	fireTableRowsDeleted(rowIndex, rowIndex);
        	fireTableDataChanged();
        }
    J'ai testé quand même mais ça ne change rien

  4. #4
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    essaies de mettre ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    modele.removeRow(ligne)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Par défaut
    Euh... je n'ai pas cette méthode O_o

  6. #6
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    ton model extends quelle model?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Par défaut
    Extends AbstractTableModel.

  8. #8
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    essaies donc ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fireTableRowsDeleted(rowIndex - 1, listeClients.size() - 1);

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 40
    Par défaut
    J'ai testé, cela me fait exactement la même chose x)

  10. #10
    Membre Expert Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Par défaut
    voici un exemple qui marche:
    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
    import java.awt.Point;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
     
    import javax.swing.table.AbstractTableModel;
     
    public class LiveSearchTableModel extends AbstractTableModel {
     
        /**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	private List<String> names = new ArrayList<String>();
        private Map<Point, Object> data = new HashMap<Point, Object>();
        private Point[] keys;
     
        public LiveSearchTableModel() {
            this.names = Arrays.asList("Point", "Name");
            data.put(new Point(1, 1), "One");
            data.put(new Point(2, 2), "Two");
            data.put(new Point(3, 3), "Three");
            this.keys = data.keySet().toArray(new Point[data.size()]);
        }
     
        public void remove(int row) {
            data.remove(keys[row]);
            keys = data.keySet().toArray(new Point[data.size()]);
            this.fireTableRowsDeleted(row, row);
        }
     
        @Override
        public int getColumnCount() {
            return names.size();
        }
     
        @Override
        public String getColumnName(int col) {
            return names.get(col);
        }
     
        @Override
        public int getRowCount() {
            return data.size();
        }
     
        @Override
        public Object getValueAt(int row, int col) {
            if (col == 0) {
                return keys[row];
            } else {
                return data.get(keys[row]);
            }
        }
    }
    et
    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
     
    import model.LiveSearchTableModel;
     
    public class TableAbstractModelTest extends JPanel {
    	public TableAbstractModelTest() {
            super(new BorderLayout());
            final LiveSearchTableModel model = new LiveSearchTableModel();
            JTable table = new JTable(model);
            RowSorter<LiveSearchTableModel> sorter =
                    new TableRowSorter<LiveSearchTableModel>(model);
                  table.setRowSorter(sorter);
            this.add(new JScrollPane(table));
            this.add(new JButton(new AbstractAction("Delete") {
     
     
    			@Override
                public void actionPerformed(ActionEvent e) {
                    model.remove(0);
                }
            }), BorderLayout.SOUTH);
        }
     
    	private void display() {
            JFrame f = new JFrame("TableModelTest");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(this);
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
     
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
     
                @Override
                public void run() {
                    new TableAbstractModelTest().display();
                }
            });
        }
    }
    Eric

  11. #11
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    C'est tout de même étrange que dans ton actionPerformed les variables id et ligne ne soit pas recalculées.

    La logique voudrait qu'il faudrait au moment du clic sur ton bouton

    1 Récupérer la (ou les lignes) sélectionnée(s) sur la JTable (getSelectedIndex)
    2 Convertir ce numéro de ligne (qui est dans l'ordre défini par la JTable) en numéro de ligne dans l'ordre défini dans le modèle via la méthode convertRowIndexToModel(int viewRowIndex) de la JTable
    3 Récupérer ton identifiant depuis ton modèle avec le numéro de ligne obtenu en 2
    4 Appeler ton DAO (attention, celui ci ne devrait pas s'exécuter dans le thread Swing)
    5 Appeler ta méthode de suppression de la ligne avec le numéro de ligne obtenu en 2 (qui elle doit bien sur faire appel au fireTableRowsDeleted

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/11/2008, 22h17
  2. [VBA-A] Problème Suppression enreg en cours
    Par _developpeur_ dans le forum Access
    Réponses: 2
    Dernier message: 17/10/2005, 21h08
  3. [JTable] Tri des données
    Par soulhouf dans le forum Composants
    Réponses: 7
    Dernier message: 08/09/2005, 15h01
  4. [JTable] tri alphabétique
    Par clairette dans le forum Composants
    Réponses: 1
    Dernier message: 27/07/2005, 12h09
  5. [JTable] Tri des colonnes
    Par djskyz dans le forum Composants
    Réponses: 10
    Dernier message: 17/03/2005, 11h14

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