Insérer le résultat d'une requete sql (ResultSet) dans 1 JTABLE [JAVA] - Programmation
Marsh Posté le 07-02-2002 à 12:14:41
Roco a écrit a écrit : c bon... |
Marsh Posté le 07-02-2002 à 15:52:31
Oui merci...
J'ai réussi ce que je voulais faire,en pompant/adaptant un script que j'ai trouvé sur le net...
Mais je ne suis totalement compris le système...
Si quelqu'un à un script bien commenté pour faire passer mon ResultSet dans un JTable, chui preneur !
Marsh Posté le 07-02-2002 à 15:54:44
oulà j'ai du mal avec mes posts...
Je voulais dire que je n'avais pas très bien compris le script (en fait je me suis contenter de le pomper...) et que donc si quelqu'un avait un script bien commenté à me passer ce serait kool !
OUF, moi y'en a pas savoir parler !
Marsh Posté le 07-02-2002 à 16:30:02
Bon, d'abord, on dit pas un script, nondidiou!!
Bon, alors, le principe est relativement simple...
Le JTable, c'est jamais que du graphique...
Le JTableModel, comme son nom l'indique, c'est le modèle....
En gros, la JTable dessine les données contenues dans un objet basé sur le modèle....Quand tu demandes à la JTable de dessiner, elle demande au modèle les données à dessiner pour chaque cellule, elle ne se préoccupe absolument pas de savoir comment le modèle gère les données, ça la regarde pas....
Donc, tu dois récupérer les données de la base dans un objet qui implémente l'interface TableModel (ou qui étend DefaultTableModel, qui est l'implémentation de base du TableModel). Ensuite, tu passes le modèle à la JTable :
JTable matable = new JTable(monmodèle)
et le tour est joué!!
Pour des exemples simples de code, le mieux est d'aller sur le site de sun (http://developper.java.sun.com) et de chercher les tutoriaux Swing..
(Les puristes, scusez moi, je me souviens jamais complètement de comment on explique un design pattern )
Marsh Posté le 07-02-2002 à 16:51:15
Oui d'accord, alors je reformule ma question :
Comment insérer les données contenues dans un ResultSet dans un JTableModel.
Marsh Posté le 07-02-2002 à 17:07:51
Bon.....Voilà les signatures des méthodes de l'interface TableModel...
<font color="#0000FF"> void addTableModelListener(TableModelListener l)</font>
Adds a listener to the list that is notified each time a change to the data model occurs.
(normalement, ta JTable doit être ModelListener de ton modèle...donc, après l'instantiation : monmodèle.addTableModelListener(matable);
<font color="#0000FF">Class getColumnClass(int columnIndex)</font>
Returns the most specific superclass for all the cell values in the column.
(Ici, pour chacune de tes colonnes, tu peux spécifier la classe des objets. Très pratique si tu veux changer la façon de les dessiner)
<font color="#0000FF">int getColumnCount()</font>
Returns the number of columns in the model.
Retourne le nombre de colonnes.
<font color="#0000FF">String getColumnName(int columnIndex)</font>
Returns the name of the column at columnIndex.
Les noms retournées par cette méthode en fonction de l'indice de colonne seront utilisés pour les entêtes de colonnes.
<font color="#0000FF">int getRowCount()</font>
Returns the number of rows in the model.
Retourne le nombre de lignes...
<font color="#0000FF">Object getValueAt(int rowIndex, int columnIndex)</font>
Returns the value for the cell at columnIndex and rowIndex.
Cette méthode est utilisée par la JTable pour savoir quoi mettre dans quelle cellule.
<font color="#0000FF"> boolean isCellEditable(int rowIndex, int columnIndex)</font>
Returns true if the cell at rowIndex and columnIndex is editable.
Pour chaque cellule, si cette méthode répond 'true', le contenu de la cellule ser éditable
<font color="#0000FF"> void removeTableModelListener(TableModelListener l)</font>
Removes a listener from the list that is notified each time a change to the data model occurs.
<font color="#0000FF">void setValueAt(Object aValue, int rowIndex, int columnIndex)</font>
Sets the value in the cell at columnIndex and rowIndex to aValue.
Utilisé par la JTable popur changer la valeur d'une colonne éditable...
L'idée, c'est que tu consrtuis un objet qui cointient les données de ton ResultSet, ou même qui encapluse ton resultSet, et qui implémente ces méthodes, pus, tu écr(is le code des méthodes, et c'est tout.....
Marsh Posté le 07-02-2002 à 23:08:43
Bon j'ai mon prog :
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.Box.*;
import javax.swing.table.*;
import java.sql.*;
public class Etat extends JPanel
{
public static JPanel PanelPrincipal, PanelSecondaire;
public static JScrollPane Defilement;
public static JTable Tableau;
public static JButton Afficher;
DefaultTableModel TabModel;
public Etat()
{
//Méthodes appliquées à la Fenetre
setPreferredSize(new Dimension (780,540));
setBorder(BorderFactory.createTitledBorder("Etat du stock" ));
//Création des éléments
String[] columnNames = {"Numéro de l'objet", "Dénomination", "Type", "Prix"};
//Création de la table
Tableau = new JTable();
Tableau.setPreferredScrollableViewportSize(new Dimension(740,480));
TabModel = (DefaultTableModel) Tableau.getModel();
TabModel.setColumnIdentifiers(columnNames);
Tableau.setModel(TabModel);
//Création du défileur
Defilement=new JScrollPane(Tableau);;
add(Defilement);
}
void refresh()
{
Tableau.removeEditor();
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver" );
} catch(java.lang.ClassNotFoundException et) {
System.err.print("ClassNotFoundException: " );
System.err.println(et.getMessage());
}
try {
Connection con=DriverManager.getConnection("jdbc:odbc:vente" );
Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs=stmt.executeQuery("SELECT numero_objet,denomination,type,prix FROM objet" );
java.sql.ResultSetMetaData rsmd = rs.getMetaData();
int colNo = rsmd.getColumnCount();
while(rs.next())
{
Object[] ligne = new Object[colNo];
for(int i = 0; i < colNo; i++){
ligne[i] = rs.getObject(i + 1);
}
TabModel.addRow(ligne);
}
con.close();
} catch(SQLException ex) {
System.err.println("SQLException: " + ex.getMessage());
}
}
}
et je l'appelle dans cette fonction ds mon prog avec le main :
Consultation.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
System.out.println("Consultation" );
CadreConsultation.setVisible(true);
CadreConsultation.refresh();
CadreAjout.setVisible(false);
CadreSuppr.setVisible(false);
}
});
Seulement, voilà y'a un pb c'est que quand je retourne dessus, il me réécrit une nouvelle fois le contenu de la requete dans le JTable au dessous du contenu de la précedente requete... ARGH!!!
L'intégralité de mon projet, bdd comprise est en zip sur :
http://eric.ledonge.free.fr/archives/Projetbdd.zip
Fo juste penser à créer une connexion ODBC nommé 'vente'
Voilà I NEED HELP !!!
Marsh Posté le 08-02-2002 à 00:15:00
Déjà, les composant graphiques en static....C douteux!! C'est la première fois que tu programmes en objet??
Bon, sinon, c'est normal qu'il te rajoute les lignes à chaque fois que tu réaffiches : tu fais les model.addRow(...); qui ajoutent les lignes à ton modèle, dans le corps de la éthode refresh....qui est appellée, comme son nom l'indique, quand ton composant est rafraichi....Donc, à chaque rafraichissement, i reajoute les lignes....
Marsh Posté le 08-02-2002 à 14:29:20
Ben....on va pas te le faire, non plus, ton machin....c pas si compliqué que ça...lis les docs, télécharge le Swing Tutorial chez Sun, et réfléchis un peu!! Vu comment c'est codé, ton machin, t'as pas réfléchi des masses jusqu'à présent, donc, hop, au boulot!
Marsh Posté le 06-02-2002 à 19:54:20
Bonjour
J'ai recherché sur gogole.fr et sur mes moteurs préférés, mais je n'ai pas trouvé de méthode assez simples pour que mon intelligence limitée puis comprendre... donc je fais appel à vous mes chers pédagogues
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.Box.*;
import javax.swing.table.*;
import java.sql.*;
public class Etat extends JPanel
{
public static JPanel PanelPrincipal, PanelSecondaire;
public static JScrollPane Defilement;
public static JTable Tableau;
public static JButton Afficher;
public Etat()
{
//Méthodes appliquées à la Fenetre
setPreferredSize(new Dimension (780,540));
setBorder(BorderFactory.createTitledBorder("Etat du stock" ));
setLayout(new BorderLayout());
//Création des éléments
//Création des panels
PanelPrincipal=new JPanel();
add(PanelPrincipal,BorderLayout.NORTH);
PanelSecondaire=new JPanel();
add(PanelSecondaire,BorderLayout.CENTER);
//Création du bouton
Afficher=new JButton("Afficher" );
PanelPrincipal.add(Afficher);
Afficher.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
System.out.println("Validation" );
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver
" );
}
catch(java.lang.ClassNotFoundException et)
{
System.err.print("ClassNotFoundException: " );
System.err.println(et.getMessage());
}
try
{
Connection con=DriverManager.getConnection("jdbc:odbc:vente" );
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery("SELECT numero_objet,denomination,type,prix FROM objet" );
while(rs.next())
{
String numero_objet=rs.getString("numero_objet" );
String denomination=rs.getString("denomination" );
String type=rs.getString("type" );
String prix=rs.getString("prix" );
System.out.println(numero_objet);
System.out.println(denomination);
System.out.println(type);
System.out.println(prix);
}
con.close();
}
catch(SQLException ex)
{
System.err.println("SQLException: " + ex.getMessage());
}
}
});
//Création du défileur
Defilement=new JScrollPane(Tableau);
/*table.setPreferredScrollableViewportSize(new Dimension(500, 70));*/
PanelSecondaire.add(Defilement);
//Création de la table
Tableau=new JTable();
}
}
Je voudrais que mon rs s'affiche dans mon chtit tableau, apparement fo passer par un modèle, mais jcomprends pas bien...