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.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.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.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.
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)