Bonjour à tous,
Je suis en 2éme année en informatique de gestion à Bruxelles. Cela fait environ 20 heures que je m'arrache les cheveux pour tenter d'actualiser ma JTable après une requête d'insertion.
Ce problème m'agace tellement qu'il me pousse (pour la première fois) à écrire sur un forum.... Aidez-moi!
Voici mon code:
De la fenêtre:
import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; public class Fenêtre extends JFrame { private static JPanel paneauTable; private static JTable table; private JButton b1; private static ResultSetTableModel rstm; public Fenêtre(){ setTitle("FenêtreTest"); setSize(1000,800); Container contenu=new Container(); paneauTable=new JPanel(); rstm=DAOrequêtes.Req_VuePlat(); rstm.addTableModelListener(new Ecouteur()); table=new JTable(); table.setModel(rstm); paneauTable.add(table); b1=new JButton("OK"); contenu.setLayout(new BorderLayout()); contenu.add(paneauTable,BorderLayout.CENTER); contenu.add(b1,BorderLayout.SOUTH); b1.addActionListener(new Ecouteur()); this.setContentPane(contenu); } public void update(){ rstm.fireTableDataChanged(); this.repaint(); } public class Ecouteur implements ActionListener,TableModelListener{ @Override public void actionPerformed(ActionEvent arg0) { DAOrequêtes.insertPlat(); update(); } @Override public void tableChanged(TableModelEvent e) { table.repaint(); } } }
De mes requêtes:
import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DAOrequêtes{ private static String requête; private static ResultSet rs; private static ResultSet rs2; /* * REQUETE:FIND PRIMARY KEY */ public static int newPrimaryKey(String table){ int maxString; try { requête="select MAX(ID) from "+table+";"; PreparedStatement pst=ConnectionToDb.Con().prepareStatement(requête); rs=pst.executeQuery(); String requête1="select COUNT(*) from "+table+" where ID=null"; Statement st2=ConnectionToDb.Con().createStatement(); rs2=st2.executeQuery(requête1); rs2.next(); rs.next(); maxString=rs.getInt(1); System.out.println("Valeur de l'Id:" + maxString ); return maxString+1; //catch (NullPointerException e){System.out.println("Ca marche pas, null pointer");} }catch (SQLException e){System.out.println("Ca marche pas, SQlException");return 1; } } public static ResultSetTableModel Req_VuePlat(){ try { Statement st = ConnectionToDb.Con().createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); String query1="Select * from Plat"; ResultSet result=st.executeQuery(query1); ResultSetTableModel rtm = new ResultSetTableModel(result); return rtm; } catch (SQLException e1) { System.out.println("Connection Failed!");return null;} } /* * REQUETE:INSERT INTO */ public static void insertPlat( ){ try { requête="insert into Plat values("+DAOrequêtes.newPrimaryKey("plat")+",'asperges',3,2,1);"; Statement st=ConnectionToDb.Con().createStatement(); st.executeUpdate(requête); } catch (SQLException e) {System.out.println("InsertPlat Failed");} } }
DE MON Table Model:
import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import javax.swing.table.AbstractTableModel; public class ResultSetTableModel extends AbstractTableModel { public ResultSetTableModel( ResultSet resultSet ) { this.resultSet = resultSet; try { this.resultSetMetaData = resultSet.getMetaData(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public int getColumnCount() { try { return resultSetMetaData.getColumnCount(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); return 0; } } @Override public int getRowCount() { try { resultSet.last(); return resultSet.getRow(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); return 0; } } @Override public Object getValueAt(int rowIndex, int columnIndex) { try { resultSet.absolute( rowIndex+1); return resultSet.getObject(columnIndex+1); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } @Override public String getColumnName( int column ) { try { return resultSetMetaData.getColumnName( column+1 ); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); return ""; } } private ResultSet resultSet; private ResultSetMetaData resultSetMetaData; public ResultSetMetaData getMetaData(){ return this.resultSetMetaData; } public ResultSet getResultSet(){ return this.resultSet; } }
et Enfin de mon Main.
import javax.swing.JFrame; public class Main { /** * @param args */ public static void main(String[] args) { Fenêtre f1=new Fenêtre(); f1.setVisible(true); f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
La requête fonctionne une ligne est bien ajoutée dans ma table mais je n'arrive pas a mettre ma fenêtre a jour.
A bientôt?
Bonjour christe,
Invoques-tu
fireTableDataChanged();
quelque part dans ton code, après avoir modifié les données ? Si tu n'appelles pas cette méthode, l'affichage ne va pas se rafraîchir. (Je dis de mémoire, mais la piste doit être bonne)