Rafraichir JTable

Rafraichir JTable - Java - Programmation

Marsh Posté le 29-06-2007 à 17:37:07    

Bonjour,
 
je voudrais rafraichir ma JTable à chaque fois que je clique sur le bouton "valider". J'essaie le fireTableDataChanged(), le repaint(), cacher et rendre visible de nouveau la Jtable et je n'y arrive pas. J'ai lu des trucs sur le fireTableDataChanged mais je dois mal m'y prendre, pouvait vous m'aider svp?
 

Code :
  1. import javax.swing.*;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. import java.io.*;
  5. import java.util.*;
  6. import javax.swing.table.*;
  7. import javax.swing.event.*;
  8. import javax.swing.event.TableModelEvent;
  9. import javax.swing.table.AbstractTableModel;
  10. import java.util.Vector;
  11. import java.sql.*;
  12. class Films implements ActionListener
  13. {
  14.    /*Déclaration des variables globales*/
  15.    JFrame fenetrePrincipale;//Fenêtre principale
  16.    /*fenêtres auxiliaires lors d'un clic sur un des boutons  
  17.     *de la fenêtre principale*/
  18.    JButton bDivx;
  19.    JButton bDvd;
  20.  JTable tableDvd, tableDivx;
  21.    JTextField saisieDivx, saisieDvd;
  22.    JButton validerDivx, validerDvd;
  23.    JLabel nom;
  24.  
  25.    String pilote = "sun.jdbc.odbc.JdbcOdbcDriver";//DRIVER
  26. String host = "jdbc:odbc:DRIVER=Microsoft Access Driver (*.mdb); DBQ=Films.mdb; ";//PATH
  27. String login = "";// USER
  28. String pw = "";//PASSWORD
  29. JDBCAdapter dataBase;
  30.  
  31.   //-----------------------------------------------------------------------
  32.   //Constructeur qui crée la fenêtre principale
  33.   private Films()
  34.   {
  35.    fenetrePrincipale=new JFrame("Liste films" );
  36.     
  37.    bDivx=new JButton("Divx" );
  38.    bDvd=new JButton("DVD" );
  39.    fenetrePrincipale.setLayout(new FlowLayout());
  40.    fenetrePrincipale.setLocation(400,300);
  41.    fenetrePrincipale.setSize(170,70);
  42.    fenetrePrincipale.setResizable(false);
  43.  
  44.    bDivx.addActionListener(this);
  45.    bDvd.addActionListener(this);
  46.  
  47.    fenetrePrincipale.add(bDivx);
  48.    fenetrePrincipale.add(bDvd);
  49.  
  50.    fenetrePrincipale.setVisible(true);
  51.  
  52.    dataBase = new JDBCAdapter(pilote,host,login,pw);
  53.   }
  54.  
  55.  
  56.   public void actionPerformed(ActionEvent evt)
  57.   {
  58.     if((evt.getSource())==bDivx)
  59.     {
  60.      divx();
  61.      bDivx.setEnabled(false);
  62.     }
  63.    
  64.     if((evt.getSource())==bDvd)
  65.     {
  66.      dvd();
  67.      bDvd.setEnabled(false);
  68.     }
  69.  
  70.      if((evt.getSource())==validerDivx)
  71.     {
  72.      dataBase.executeQuery("INSERT INTO Divx (titre_Divx) VALUES ('"+saisieDivx.getText()+"')" );
  73.      saisieDivx.setText("" );
  74.     }
  75.  
  76.      if((evt.getSource())==validerDvd)
  77.     {
  78.      dvd();
  79.      bDvd.setEnabled(false);
  80.     }
  81.   }
  82.   //Fenêtre pour les divx  
  83.   public void divx()
  84.   {
  85.    JFrame fenetreDivx;//fenêtre d'affichage des Divx
  86.  
  87.    JPanel p=new JPanel();
  88.    p.setLayout(new FlowLayout());
  89.  
  90.    fenetreDivx=new JFrame();
  91.    fenetreDivx.setSize(750,800);
  92.  
  93.    saisieDivx=new JTextField(45);
  94.    validerDivx=new JButton("Valider" );
  95.    validerDivx.addActionListener(this);
  96.    nom=new JLabel("Nom:" );
  97.  
  98.    p.add(nom);
  99.    p.add(saisieDivx);
  100.    p.add(validerDivx);
  101.  
  102.    fenetreDivx.add(p,BorderLayout.SOUTH);
  103.  
  104.    tableDivx=new JTable();
  105.    fenetreDivx.add(tableDivx,BorderLayout.CENTER);
  106.            
  107. dataBase.executeQuery("SELECT titre_Divx FROM Divx" );
  108. tableDivx.setModel(dataBase);
  109.  
  110.    fenetreDivx.setVisible(true);
  111.   }
  112.  
  113.  
  114.   //Fenêtre pour les dvd
  115.   public void dvd()
  116.   {
  117.    JFrame fenetreDvd;
  118.  
  119.    JPanel p=new JPanel();
  120.    p.setLayout(new FlowLayout());
  121.  
  122.    fenetreDvd=new JFrame("Liste des DVD" );
  123.    fenetreDvd.setSize(750,800);
  124.  
  125.    saisieDvd=new JTextField(45);
  126.    validerDvd=new JButton("Valider" );
  127.    validerDvd.addActionListener(this);
  128.    nom=new JLabel("Nom:" );
  129.  
  130.    p.add(nom);
  131.    p.add(saisieDvd);
  132.    p.add(validerDvd);
  133.  
  134.    fenetreDvd.add(p,BorderLayout.SOUTH);
  135.  
  136.    tableDvd=new JTable();
  137.    fenetreDvd.add(tableDvd,BorderLayout.CENTER);
  138.            
  139. dataBase.executeQuery("SELECT titre_DVD FROM DVD" );
  140. tableDvd.setModel(dataBase);
  141.  
  142.    fenetreDvd.setVisible(true);
  143.   }
  144.  
  145.   //Méthode applelée lors du lancement du fichier java
  146.   public static void main(String[] arg)
  147.   {
  148.     Films test=new Films();
  149.   }
  150. }


 

Code :
  1. import java.util.Vector;
  2. import java.sql.*;
  3. import javax.swing.table.AbstractTableModel;
  4. import javax.swing.event.TableModelEvent;
  5. public class JDBCAdapter extends AbstractTableModel {
  6.     Connection          connection;
  7.     Statement           statement;
  8.     ResultSet           resultSet;
  9.     String[]            columnNames = {};
  10.     Vector  rows = new Vector();
  11.     ResultSetMetaData   metaData;
  12.     public JDBCAdapter(String driverName,String url,
  13.                        String user, String passwd) {
  14.         try {
  15.             Class.forName(driverName);
  16.             System.out.println("Opening db connection" );
  17.             connection = DriverManager.getConnection(url, user, passwd);
  18.             //statement = connection.createStatement();
  19.             statement = connection.createStatement(
  20.    ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE );
  21.         }
  22.         catch (ClassNotFoundException ex) {
  23.             System.err.println("Cannot find the database driver classes." );
  24.             System.err.println(ex);
  25.         }
  26.         catch (SQLException ex) {
  27.             System.err.println("Cannot connect to this database." );
  28.             System.err.println(ex);
  29.         }
  30.      }
  31.     public void executeQuery(String query) {
  32.         if (connection == null || statement == null) {
  33.             System.err.println("There is no database to execute the query." );
  34.             return;
  35.         }
  36.         try {
  37.             resultSet = statement.executeQuery(query);
  38.             metaData = resultSet.getMetaData();
  39.             int numberOfColumns =  metaData.getColumnCount();
  40.             columnNames = new String[numberOfColumns];
  41.             // Get the column names and cache them.
  42.             // Then we can close the connection.
  43.             for(int column = 0; column < numberOfColumns; column++) {
  44.                 columnNames[column] = metaData.getColumnLabel(column+1);
  45.             }
  46.             // Get all rows.
  47.             rows = new Vector();
  48.             while (resultSet.next()) {
  49.                 Vector newRow = new Vector();
  50.                 for (int i = 1; i <= getColumnCount(); i++) {
  51.             newRow.addElement(resultSet.getObject(i));
  52.                 }
  53.                 rows.addElement(newRow);
  54.             }
  55.             //  close(); Need to copy the metaData, bug in jdbc:odbc driver.
  56.             fireTableChanged(null); // Tell the listeners a new table has arrived.
  57.            
  58.         }
  59.         catch (SQLException ex) {
  60.             System.err.println(ex);
  61.         }
  62.     }
  63.     public void close() throws SQLException {
  64.         System.out.println("Closing db connection" );
  65.         resultSet.close();
  66.         statement.close();
  67.         connection.close();
  68.     }
  69.     protected void finalize() throws Throwable {
  70.         close();
  71.         super.finalize();
  72.     }
  73.     //////////////////////////////////////////////////////////////////////////
  74.     //
  75.     //             Implementation of the TableModel Interface
  76.     //
  77.     //////////////////////////////////////////////////////////////////////////
  78.     // MetaData
  79.     public String getColumnName(int column) {
  80.         if (columnNames[column] != null) {
  81.             return columnNames[column];
  82.         } else {
  83.             return "";
  84.         }
  85.     }
  86.     public Class getColumnClass(int column) {
  87.         int type;
  88.         try {
  89.             type = metaData.getColumnType(column+1);
  90.         }
  91.         catch (SQLException e) {
  92.             return super.getColumnClass(column);
  93.         }
  94.         switch(type) {
  95.         case Types.CHAR:
  96.         case Types.VARCHAR:
  97.         case Types.LONGVARCHAR:
  98.             return String.class;
  99.         case Types.BIT:
  100.             return Boolean.class;
  101.         case Types.TINYINT:
  102.         case Types.SMALLINT:
  103.         case Types.INTEGER:
  104.             return Integer.class;
  105.         case Types.BIGINT:
  106.             return Long.class;
  107.         case Types.FLOAT:
  108.         case Types.DOUBLE:
  109.             return Double.class;
  110.         case Types.DATE:
  111.             return java.sql.Date.class;
  112.         default:
  113.             return Object.class;
  114.         }
  115.     }
  116.     public boolean isCellEditable(int row, int column) {
  117.        try {
  118.             return metaData.isWritable(column+1);
  119.        }
  120.         catch (SQLException e) {
  121.             return false;
  122.         }
  123.     }
  124.     public int getColumnCount() {
  125.         return columnNames.length;
  126.     }
  127.     // Data methods
  128.     public int getRowCount() {
  129.         return rows.size();
  130.     }
  131.     public Object getValueAt(int aRow, int aColumn) {
  132.         Vector row = (Vector)rows.elementAt(aRow);
  133.         return row.elementAt(aColumn);
  134.     }
  135.     public String dbRepresentation(int column, Object value) {
  136.         int type;
  137.         if (value == null) {
  138.             return "null";
  139.         }
  140.         try {
  141.             type = metaData.getColumnType(column+1);
  142.         }
  143.         catch (SQLException e) {
  144.             return value.toString();
  145.         }
  146.         switch(type) {
  147.         case Types.INTEGER:
  148.         case Types.DOUBLE:
  149.         case Types.FLOAT:
  150.             return value.toString();
  151.         case Types.BIT:
  152.             return ((Boolean)value).booleanValue() ? "1" : "0";
  153.         case Types.DATE:
  154.             return value.toString(); // This will need some conversion.
  155.         default:
  156.             return "\""+value.toString()+"\"";
  157.         }
  158.     }
  159.     public void setValueAt(Object value, int row, int column) {
  160.         try {
  161.             String tableName = metaData.getTableName(column+1);
  162.             // Some of the drivers seem buggy, tableName should not be null.
  163.             if (tableName == null) {
  164.                 System.out.println("Table name returned null." );
  165.             }
  166.             String columnName = getColumnName(column);
  167.             String query =
  168.                 "update "+tableName+
  169.                 " set "+columnName+" = "+dbRepresentation(column, value)+
  170.                 " where ";
  171.             // We don't have a model of the schema so we don't know the
  172.             // primary keys or which columns to lock on. To demonstrate
  173.             // that editing is possible, we'll just lock on everything.
  174.             for(int col = 0; col<getColumnCount(); col++) {
  175.                 String colName = getColumnName(col);
  176.                 if (colName.equals("" )) {
  177.                     continue;
  178.                 }
  179.                 if (col != 0) {
  180.                     query = query + " and ";
  181.                 }
  182.                 query = query + colName +" = "+
  183.                     dbRepresentation(col, getValueAt(row, col));
  184.             }
  185.             System.out.println(query);
  186.             System.out.println("Not sending update to database" );
  187.              statement.executeQuery(query);
  188.         }
  189.         catch (SQLException e) {
  190.             //     e.printStackTrace();
  191.             System.err.println("Update failed" );
  192.         }
  193.         Vector dataRow = (Vector)rows.elementAt(row);
  194.         dataRow.setElementAt(value, column);
  195.     }
  196. }

Reply

Marsh Posté le 29-06-2007 à 17:37:07   

Reply

Marsh Posté le 29-06-2007 à 21:30:21    

up

Reply

Marsh Posté le 19-07-2007 à 17:12:05    

up

Reply

Marsh Posté le 08-02-2008 à 18:45:50    

salut,
J'ai le meme probleme.  
J'utilise une JTable qui contient des informations d'un sgbdoo.
le probleme est que quand je valide, ca n'apparait pas dans ma JTable.
Il faut que j'arrete le programme et que je le run pour visualiser la ligne rajouter.
 
Ce que j'aimerai avoir, c'est que ca apparait tout de suite quand je valide.
Aurais-tu trouver depuis le temps que ta posté ce message ?
 
merciiiiiiiiiiii

Reply

Marsh Posté le 09-02-2008 à 00:40:33    

Normalement, ça devrait fonctionner comme sur des roulettes. Mais pour cela, il faudrait déjà que le modèle du tableau (l'instance de la classe qui implémente TableModel) soit juste un modèle de données ! Pas un modèle ET un accesseur de données persistantes !
 
Moralité : commmencez tous les 2 par séparer votre gestion des données à présenter dans le tableau Swing (en clair, la classe qui implémente TableModel) et votre code qui interroge votre base de données dans 2 classes bien séparées (la seconde faisant des setValueAt() pour modifier l'instance de la première), et vous verrez, tout marchera tout de suite beaucoup mieux. Et en plus, votre code sera beaucoup mieux écrit (puisque votre gestion de tableau Swing sera beaucoup plus indépendante de la manière dont les données sont obtenues), donc plus facile à maintenir et à faire évoluer.
 
Note : Dans ton code, tequilla, tu appelles "fireTableChanged(null);" (avec le magnifique commentaire "// Tell the listeners a new table has arrived." ). Si tu ne précises pas ce qui a changé (avec une instance appropriée de TableModelEvent, qu'attend cette opération), ça ne risque pas de faire grand chose... Ou ne serait-ce pas plutôt un "fireTableDataChanged();" que tu chercherais à faire ? Ceci dit, tu gagneras beaucoup à appliquer ma première préconisation plutôt qu'à juste appeler "fireTableDataChanged()", car si tu le fais, ton code sera bien meilleur, et tu n'auras même plus besoin de jouer du fireXXX() pour que ça marche.

Reply

Marsh Posté le 09-02-2008 à 11:47:18    

salut,
 
en faite, j'aimerai juste rafraichir ma JTable avec mon bouton valider:
 
public void actionPerformed(ActionEvent e) {
             int nbprestation = 0;
 DefaultTableModel tm = new DefaultTableModel();
 ObjectContainer db = Db4o.openFile("coiffure.yap" );
 Collection<Prestation> prestations = db.query(Prestation.class);
 for(Prestation instance : prestations){
 tm.addRow(new Object[]{
 instance.getNum(),instance.service(),instance.cout(),instance.getDate()});
 ca += instance.cout();
 nbprestation+=1;
             }
 Object coupes = coupe.getSelectedItem();
 coupe.getSelectedIndex();
   
 //////////////////////////pour coupe homme////////////////////////////////////////
if(coupes.equals("Coupe homme" )){
 InterfaceService is1=new CoupeHomme();
   
 if(brushing.isSelected()){
 is1=new Brushing(is1);  
 }
 if(couleur.isSelected()){
 is1=new Couleur(is1);
 }
 if(permanante.isSelected()){
 is1=new Permanante(is1);
 }
  Object source = e.getSource();
 if(source == valider){
 nbprestation= nbprestation+1;
 Prestation p1 = new Prestation (nbprestation,new Date(),is1);
 labtotal.setText("Total = "+is1.cout() );
 db.set(p1);
 System.out.println("homme" );
   
 /////////ajouter ici pour rafraichir la JTable/////////
 

 }
 db.close();
}
 

Reply

Marsh Posté le 10-02-2008 à 16:46:55    

J'avoue n'avoir pas tout lu mais si ça peut vous aider, entre autre avec le fireTableCellUpdated(row, col); :
http://mnasrawin.free.fr/index.php [...] nt-jtable/


Message édité par Profil supprimé le 03-01-2009 à 03:40:20
Reply

Marsh Posté le 20-02-2008 à 14:58:07    

merci, je vais essayer ca car j'avais mis ce truc en suspend pour autre chose car pas le temps depuis quelques mois

Reply

Marsh Posté le 24-02-2008 à 18:42:51    

salut,
 
mes données present dans la JTable ne sont pas a fixées en durs, c'est pour ce la que j'utilise un DefaultTableModel.
Quelque a-t-il une idée car ca fait bientot 1 mois que je galère la dessus.
Aidez svp merci .

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed