Partage
  • Partager sur Facebook
  • Partager sur Twitter

Supprimer et ajouter ligne JTable

TP Garage

    26 avril 2017 à 18:49:56

    Bonjour à tous,

    J'ai besoin de votre aide, je suis dans le dernier tp du cours "apprenez à coder en JAVA" et je suis complètement bloqué ...

    J'arrive bien à ajouter ou supprimer un véhicule dans ma base de données mais je ne parviens pas à actualiser l'affichage de ma table !!

    Quelqu'un peut-il m'aider ?

    Vous trouvez ci-dessous mes principaux codes ... n'hésitez pas à me dire si vous voulez voir autre chose !!

    Mais pour l'instant j'ai l'erreur : Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JTable$1 cannot be cast to fr.ocr.ihm.TableModel

    J'espère que quelqu'un aura la solution !!

    Merci

    Raumann

    TableModel.java

    package fr.ocr.ihm;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.swing.table.AbstractTableModel;
    
    public class TableModel extends AbstractTableModel {
    	 
        private List<Object[]> data = new ArrayList<Object[]>();
        private String[] title;
         
        public TableModel(Object[][] data, String[] title) {
            this.title = title;
            for (Object[] vehicule:data)
            {
                this.data.add(vehicule);
            }
        }
         
        public String getColumnName(int col) {
            return this.title[col];
        }
         
        @Override
        public int getColumnCount() {
            return this.title.length;
        }
     
        @Override
        public int getRowCount() {
            return this.data.size();
        }
     
        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            if(!this.getColumnName(columnIndex).equals("ACTION") && !this.getColumnName(columnIndex).equals("DETAIL"))
                return this.data.get(rowIndex)[columnIndex];
            else
                return null;
        }
         
        public void setValueAt(Object value, int rowIndex, int columnIndex) {
            if(!this.getColumnName(columnIndex).equals("ACTION") && !this.getColumnName(columnIndex).equals("DETAIL"))
                this.data.get(rowIndex)[columnIndex] = value;
        }
         
        public Class getColumnClass(int col) {
            return getValueAt(0, col).getClass();
        }
         
        public void removeRow(int position) {
            this.data.remove(position);
            this.fireTableDataChanged();
        }
         
        public void addRow(Object[] vehicule) {
            this.data.add(vehicule);
            this.fireTableDataChanged();
        }
         
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return true;
        }
    }

    VehiculeDAO.java

    package fr.ocr.dao.implement;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import fr.ocr.dao.DAO;
    import voiture.Vehicule;
    import voiture.option.Option;
    
    public class VehiculeDAO extends DAO<Vehicule>{
    	
    	public VehiculeDAO(Connection conn){
    		super(conn);
    	}
    	
    	public Vehicule find(int id) {
    		Vehicule vehicule = new Vehicule();
    		
    		try{
    			ResultSet resultVehicule = this.connect.createStatement(
    					ResultSet.TYPE_SCROLL_INSENSITIVE,
    					ResultSet.CONCUR_READ_ONLY
    					).executeQuery("SELECT * FROM vehicule WHERE vehicule.id = "+id);
    			
    			if(resultVehicule.first()){
    		        vehicule = new Vehicule(id, resultVehicule.getString("nom"), vehicule.getMarque(), vehicule.getMoteur(), resultVehicule.getDouble("prix"));
    		        
    			
    			resultVehicule = this.connect.createStatement(
    					ResultSet.TYPE_SCROLL_INSENSITIVE,
    					ResultSet.CONCUR_READ_ONLY
    					).executeQuery("SELECT id_vehicule, id_option FROM vehicule_option vehop "+
    							"INNER JOIN option opt ON opt.id = vehop.id_option AND vehop.id_vehicule = "+id);
    			
    			OptionDAO optDao = new OptionDAO(this.connect);
    			
    			while(resultVehicule.next()){
    				vehicule.addOption(optDao.find(resultVehicule.getInt("id_option")));
    			}
    			}		
    							
    			
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return vehicule;
    	}
    	
    	@Override
    	public boolean create(Vehicule v){
    		boolean action = false;
    		try{
    			ResultSet nextID = this.connect.prepareStatement("CALL NEXT VALUE FOR seq_vehicule_id").executeQuery();
    	    	if (nextID.next()){
    	    		int id = nextID.getInt(1);
    	    		
    	    		PreparedStatement prepareCreateVehicule = this.connect.prepareStatement("INSERT INTO vehicule VALUES(?,?,?,?,?)");
    	    		
    	    		prepareCreateVehicule.setInt(1, v.getMarque().getId());
    	    		prepareCreateVehicule.setInt(2, v.getMoteur().getId());
    	    		prepareCreateVehicule.setDouble(3, v.getPrix());
    	    		prepareCreateVehicule.setString(4, v.getNom());
    	    		prepareCreateVehicule.setInt(5, id);
    	    		
    	    		action = prepareCreateVehicule.execute();
    	    		
    	    		if (!v.getOptions().isEmpty()) {
    	    			PreparedStatement prepareCreateOptVehicule = this.connect.prepareStatement("INSERT INTO vehicule_option VALUES(?,?)");
    		    		
    	                for (Option o : v.getOptions()) {
    	                    prepareCreateOptVehicule.setInt(1, id);
    	                    prepareCreateOptVehicule.setInt(2, o.getId());
    	                    action = prepareCreateOptVehicule.execute();
    	                }
    
    	            }
    	    		
    	    	}
    	    		
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return action;
    	}
    	
    	@Override
    	public boolean delete(int id) {
    		boolean action = false;
    		try{
    			
    			PreparedStatement prepareDeleteOptVehicule = this.connect.prepareStatement("DELETE FROM Vehicule_Option WHERE ID_Vehicule = ?");
    			prepareDeleteOptVehicule.setInt(1, id);
    			action = prepareDeleteOptVehicule.execute();
    			
    			PreparedStatement prepareDeleteVehicule = this.connect.prepareStatement("DELETE FROM Vehicule WHERE ID = ?");
    			prepareDeleteVehicule.setInt(1, id);
    			action = prepareDeleteVehicule.execute();
    			
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return action;
    	}
    
    	@Override
    	public boolean update(Vehicule obj) {
    		return false;
    	}
    
    	
    }
    

    ButtonListener.java

    package fr.ocr.ihm.listener;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.sql.Connection;
    
    import javax.swing.JTable;
    
    import fr.ocr.dao.AbstractDAOFactory;
    import fr.ocr.dao.DAO;
    import fr.ocr.ihm.TableModel;
    import fr.ocr.sql.HsqldbConnection;
    import voiture.Vehicule;
    
    //Notre listener pour le bouton
    public class ButtonListener implements ActionListener {
    	protected int column, row;
    	protected int idVehicule;
    	protected JTable table;
    	protected static Connection connect = HsqldbConnection.getInstance();
    	
    	public void setColumn(int col) {
    		this.column = col;
    	}
    
    	public void setRow(int row) {
    		this.row = row;
    	}
    
    	public void setTable(JTable table) {
    		this.table = table;
    	}
    
    	public void actionPerformed(ActionEvent e) {
    		//if(table.getRowCount() > 0){
    		idVehicule = Integer.parseInt(table.getValueAt(row, 4).toString());
            //Effacement dans la bdd
    		AbstractDAOFactory adf = AbstractDAOFactory.getFactory(AbstractDAOFactory.DAO_FACTORY);
            DAO<Vehicule> vehiculeDAO = adf.getVehiculeDAO();
            vehiculeDAO.delete(idVehicule);
            //Effacement de la ligne
            ((TableModel)table.getModel()).removeRow(row);
            
    	}
    	
    }
    







    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      27 avril 2017 à 12:09:28

      Bonjour,

      L'erreur indique que ton JTable$1 ne peut pas être casté en TableModel ... D'ailleurs, il t'indiques plus loin la classe et la ligne ou ce bug se produit, ce qui aurait pu être pratique pour nous.

      Ta classe "AbstractTableModel" hérite-t-elle de la bonne classe ?

      • Partager sur Facebook
      • Partager sur Twitter
        27 avril 2017 à 14:23:47

        Bonjour,

        Merci pour ta réponse.

        D'après l'erreur, le problème se situe à la ligne 42 de ma classe ButtonListener "((TableModel)table.getModel()).removeRow(row);"

        Comment ça ma classe "AbstractTableModel" hérite-t-elle de la bonne classe ?

        Merci pour ton aide.

        Voici l'erreur complète quand je clique sur le bouton supprimer de ma JTable :

        Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JTable$1 cannot be cast to fr.ocr.ihm.TableModel

        at fr.ocr.ihm.listener.ButtonListener.actionPerformed(ButtonListener.java:42)

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

        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)

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

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

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

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

        at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)

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

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

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

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

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

        at javax.swing.plaf.basic.BasicTableUI$Handler.repostEvent(BasicTableUI.java:948)

        at javax.swing.plaf.basic.BasicTableUI$Handler.mouseReleased(BasicTableUI.java:1164)

        at javax.swing.plaf.basic.BasicTableUI$MouseInputHandler.mouseReleased(BasicTableUI.java:802)

        at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:290)

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

        at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)

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

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

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

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

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

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

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

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

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

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

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

        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)

        at java.awt.EventQueue.access$500(EventQueue.java:97)

        at java.awt.EventQueue$3.run(EventQueue.java:709)

        at java.awt.EventQueue$3.run(EventQueue.java:703)

        at java.security.AccessController.doPrivileged(Native Method)

        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)

        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)

        at java.awt.EventQueue$4.run(EventQueue.java:731)

        at java.awt.EventQueue$4.run(EventQueue.java:729)

        at java.security.AccessController.doPrivileged(Native Method)

        at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)

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

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

        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)

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

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

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

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

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          28 avril 2017 à 14:52:25

          Bonjour,

          Tu as une erreur de cast sur ce passage:

          ((TableModel)table.getModel())

          Es-tu sur que ta classe "TableModel" et de la même classe que "table.getModel" (en gros, regardes ce que récupères "getModel()" ;)

          • Partager sur Facebook
          • Partager sur Twitter
            28 avril 2017 à 16:45:51

            Bonjour John,

            Le message d'erreur est justement dû au fait que ce n'est pas le cas non ? ... mais je ne comprends pas du tout cette partie.

            Autant le reste du TP s'est plutôt bien passé mais cette question de modèle de table me pose vraiment problème.

            Si j'ai bien compris la JTable est construite à partir de la classe DAOTableFactory. Et La classe Garage s'occupe de l'afficher. Mais je n'arrive pas à faire le lien avec le TableModel ... Faut-il utiliser le setTable de la classe ButtonListener ?

            Peut-être que toutes mes questions sont stupides ... mais je suis vraiment perdu là !! Merci pour tes réponses et ton temps !!

            DAOTableFactory.java

            public static JTable getTable(Connection conn, DatabaseTable table) {
            		
            		JTable tab = new JTable();
            
            		try (
            				Statement state = conn.createStatement(
            					ResultSet.TYPE_SCROLL_INSENSITIVE,
            					ResultSet.CONCUR_UPDATABLE);
            				ResultSet result = state.executeQuery("SELECT * FROM " + table);){
            			
            			ResultSetMetaData resultMeta = result.getMetaData();
            			int nbreColumn = resultMeta.getColumnCount();
            			
            			// Pour r�cup�rer le nombre total de ligne
            			// on se place sur la derni�re puis on revient avant la premi�re
            			// pour parcourir
            			result.last();
            			int nbreRow = result.getRow();
            			result.beforeFirst();
            
            			String[] title = new String[nbreColumn];
            			Object[][] data = new Object[nbreRow][nbreColumn];
            
            			/**
            			 * Pour la table vehicule, on rajoute une colonne qui sera le bouton
            			 * de suppression de ligne
            			 */
            			if (table.equals(DatabaseTable.VEHICULE)) {
            				title = new String[nbreColumn + 2];
            				title[nbreColumn] = "DETAIL";
            				title[nbreColumn + 1] = "ACTION";
            
            				data = new Object[nbreRow][nbreColumn + 2];
            				for (Object[] rows : data) {
            					rows[nbreColumn] = "DETAIL";
            					rows[nbreColumn + 1] = "SUPPRIMER";
            				}
            			}
            
            			for (int i = 0; i < nbreColumn; i++)
            				title[i] = resultMeta.getColumnName(i + 1).toUpperCase();
            
            			int nbreLine = 0;
            			while (result.next()) {
            				for (int i = 0; i < nbreColumn; i++)
            					data[nbreLine][i] = result.getObject(i + 1).toString();
            
            				nbreLine++;
            			}
            
            			tab = new JTable(data, title);
            
            			/**
            			 * On affiche les boutons uniquement pour la table v�hicule
            			 */
            			if (table.equals(DatabaseTable.VEHICULE)) {
            				tab.getColumn("ACTION").setCellRenderer(
            						new ButtonRenderer("SUPPRIMER"));
            				tab.getColumn("ACTION").setCellEditor(
            						new ButtonEditor(new JCheckBox(), "SUPPRIMER"));
            				tab.getColumn("DETAIL").setCellRenderer(
            						new ButtonRenderer("DETAIL"));
            				tab.getColumn("DETAIL").setCellEditor(
            						new ButtonEditor(new JCheckBox(), "DETAIL",
            								new ViewDetailVehiculeListener()));
            			}
            			tab.setRowHeight(30);
            		} catch (SQLException e) {
            			new DAOException(e.getMessage());
            		}
            
            		return tab;
            	}

            Garage.java

            package fr.ocr.ihm;
            
            import java.awt.BorderLayout;
            import java.awt.event.ActionEvent;
            import java.awt.event.ActionListener;
            import java.awt.event.KeyEvent;
            
            import javax.swing.JButton;
            import javax.swing.JCheckBox;
            import javax.swing.JComboBox;
            import javax.swing.JFrame;
            import javax.swing.JMenu;
            import javax.swing.JMenuBar;
            import javax.swing.JMenuItem;
            import javax.swing.JPanel;
            import javax.swing.JScrollPane;
            import javax.swing.JTable;
            import javax.swing.KeyStroke;
            
            import fr.ocr.ihm.listener.NewVehiculeListener;
            import fr.ocr.ihm.listener.ViewMenuListener;
            import fr.ocr.sql.DAOTableFactory;
            import fr.ocr.sql.DatabaseTable;
            import fr.ocr.sql.HsqldbConnection;
            
            public class Garage extends JFrame {
            
            	//Les diff�rents objets de notre IHM
            	private JMenuBar bar = new JMenuBar();
            	private JMenu menuVehicule = new JMenu("Vehicule");
            	private JMenuItem menuVehiculeAjouter = new JMenuItem("Ajouter");
            	private JMenuItem menuVehiculeVoir = new JMenuItem("Voir");
            
            	private JMenu menuMarque = new JMenu("Marque");
            	private JMenuItem menuMarqueVoir = new JMenuItem("Voir");
            
            	private JMenu menuMoteur = new JMenu("Moteur");
            	private JMenuItem menuMoteurVoir = new JMenuItem("Voir");
            
            	private JMenu menuOption = new JMenu("Option");
            	private JMenuItem menuOptionVoir = new JMenuItem("Voir");
            
            	private JMenu menuTypemoteur = new JMenu("Type de moteur");
            	private JMenuItem menuTypemoteurVoir = new JMenuItem("Voir");
            
            	private JTable tableau;
            	private JButton change = new JButton("Changer la taille");
            	// Contenu de notre combo
            	private String[] comboData = { "Tr�s bien", "Bien", "Mal" };
            
            	private JPanel contentPane = new JPanel();
            
            	public Garage() {
            
            		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            		this.setTitle("JTable");
            		this.setSize(800, 400);
            		// Donn�es de notre tableau
            
            		this.getContentPane()
            				.add(new JScrollPane(DAOTableFactory.getTable(
            						HsqldbConnection.getInstance(), DatabaseTable.VEHICULE)),
            						BorderLayout.CENTER);
            		this.setLocationRelativeTo(null);
            		initMenu();
            	}
            
            	/**
            	 * M�thode qui initialise les points de menu
            	 */
            	private void initMenu() {
            		menuVehicule.add(menuVehiculeVoir);
            		menuVehicule.add(menuVehiculeAjouter);
            		menuVehiculeAjouter.addActionListener(new NewVehiculeListener(this));
            		menuVehiculeAjouter.setAccelerator(KeyStroke.getKeyStroke(
            				KeyEvent.VK_A, KeyEvent.CTRL_MASK + KeyEvent.SHIFT_DOWN_MASK));
            		menuVehiculeVoir.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,
            				KeyEvent.CTRL_MASK + KeyEvent.SHIFT_DOWN_MASK));
            		menuVehiculeVoir.addActionListener(new ViewMenuListener(this,
            				DatabaseTable.VEHICULE));
            		menuVehicule.setMnemonic('v');
            
            		menuMarque.add(menuMarqueVoir);
            		menuMarque.setMnemonic('a');
            		menuMarqueVoir.addActionListener(new ViewMenuListener(this,
            				DatabaseTable.MARQUE));
            
            		menuMoteur.add(menuMoteurVoir);
            		menuMoteur.setMnemonic('m');
            		menuMoteurVoir.addActionListener(new ViewMenuListener(this,
            				DatabaseTable.MOTEUR));
            
            		menuOption.add(menuOptionVoir);
            		menuOption.setMnemonic('o');
            		menuOptionVoir.addActionListener(new ViewMenuListener(this,
            				DatabaseTable.OPTION));
            
            		menuTypemoteur.add(menuTypemoteurVoir);
            		menuTypemoteur.setMnemonic('t');
            		menuTypemoteurVoir.addActionListener(new ViewMenuListener(this,
            				DatabaseTable.TYPEMOTEUR));
            
            		bar.add(menuVehicule);
            		bar.add(menuMarque);
            		bar.add(menuMoteur);
            		bar.add(menuOption);
            		bar.add(menuTypemoteur);
            
            		this.setJMenuBar(bar);
            	}
            
            	public static void main(String[] args) {
            		Garage g = new Garage();
            		g.setVisible(true);
            	}
            
            }
            





            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              2 mai 2017 à 10:46:22

              Bonjour,

              Remplace cette ligne

              ((TableModel)table.getModel()).removeRow(row);

              par

              System.out.println(table.getModel());
              ((TableModel)table.getModel()).removeRow(row);

              Selon le résultat obtenu, tu devrais réussir à t'en sortir.

              Sinon, ce tuto pourrait peut-être t'aider à mieux comprendre les JTable et leur TableModel.

              http://docs.oracle.com/javase/tutorial/uiswing/components/table.html


              • Partager sur Facebook
              • Partager sur Twitter
                2 mai 2017 à 14:10:34

                Bonjour,

                Quand je rajoute la ligne que tu m'as dit cela m'affiche : javax.swing.JTable$1@66426476

                Merci pour le tuto, je vais regarder ça.

                Bonne journée

                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  2 mai 2017 à 14:44:23

                  System.out.println(table.getModel().getClass());
                  ((TableModel)table.getModel()).removeRow(row);

                  Pardon, c'était plutôt ça ^^
                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 mai 2017 à 14:56:15

                    Dans ce cas cela m'affiche : class javax.swing.JTable$1
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      2 mai 2017 à 16:51:45

                      Donc ta JTable ne doit pas pouvoir se caster en TableModel ;)

                      -
                      Edité par Anonyme 2 mai 2017 à 16:51:57

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Supprimer et ajouter ligne JTable

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown