cs_Kloun
Messages postés23Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention23 octobre 2003
-
26 août 2003 à 08:05
cs_Kloun
Messages postés23Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention23 octobre 2003
-
26 août 2003 à 17:37
Bonjour,
Je développe (et je débute !) une appli de gestion de clients avec des fenêtres MDI.
Une de ces fenêtres doit permettre une recherche multi-critère dans une base de données, les résultats étant affichés pour sélection dans une JTable.
Ma question est simple : comment faire pour raffraîchir la JTable lorsque la requête change ?
Merci
benohite
Messages postés210Date d'inscriptionvendredi 11 avril 2003StatutMembreDernière intervention18 décembre 20037 26 août 2003 à 09:26
bonjour,
si j ai bien compris tu es dans le cas ou les donnees de ton model sont modifiées non pas via la jtable mais par le traitement d une requete
dans ce cas la classe AbstractTablModel te fourni diverses methodes te permettant de signaler les changements a la jtable:
fireTableCellUpdated(int row, int column)
fireTableRowsDeleted(int firstRow, int lastRow)
fireTableRowsUpdated(int firstRow, int lastRow)
cs_Kloun
Messages postés23Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention23 octobre 2003 26 août 2003 à 14:33
(Comme je disais, je débute ... )
Les critères de sélection sont saisis dans des JTextField et la requète est générée en appuyant sur un bouton "Recherche".
Je récupère les données dans un tableau.
Le souci, c'est que je n'arrive pas à afficher les nouvelles données dans la JTable ...
public class fenRecherche extends JInternalFrame {
JTextField jtfNom = new JTextField();
JTextField jtfPrenom = new JTextField();
String[] columnNames = {"Nom" , "Prénom" , "Sexe" , "Date de naiss."};
String[][] data ;
JTable jtRechPatient ;
journal fl = new journal ("d:\\TEMP\\Visage.log");
TableModel baseModel ;
public int nbLigne (ResultSet rs) {
int i = 0;
try {
for (; rs.next(); ) {
++i;
}
}
catch (SQLException ex) {
fl.ecritLigne("nbLigne", ex.getMessage());
i = -1;
}
return i;
}
public fenRecherche(String titre, String sSql) {
this.setTitle(titre);
this.setMaximizable(true);
this.setClosable(true);
this.setSize(800, 400);
this.setResizable(true);
this.setVisible(true);
this.setToolTipText("Recherche d'un patient");
int i = 0;
int a = 0;
try {
ResultSet rRetour = gestionDB.reqSelect(sSql);
ResultSet rRetour2 = gestionDB.reqSelect(sSql);
int nbLigneSelect = nbLigne(rRetour);
data = new String [nbLigneSelect][4];
rRetour.close();
String sSql = "Select nom, prenom, sexe, datenaiss from patient";
fl.ecritLigne("-" + sNom + "-");
if (sNom != "") {
sSql = sSql + " where nom like '%" + sNom + "%'";
}
fl.ecritLigne("-" + sPrenom + "-");
/*
if (sPrenom != "") {
sSql = sSql + " where prenom like '%" + sPrenom + "%'";
}
*/ fl.ecritLigne(sSql);
raffraichitTab(sSql);
}
void raffraichitTab (String sSql){
int i = 0;
int a = 0;
try {
ResultSet rRetour = gestionDB.reqSelect(sSql);
ResultSet rRetour2 = gestionDB.reqSelect(sSql);
int nbLigneSelect = nbLigne(rRetour);
data = new String [nbLigneSelect][4];
rRetour.close();
////////////////////////////
// C'est là que ça coince //
////////////////////////////
}
catch (SQLException ex) {
fl.ecritLigne("Ouverture recherche - Erreur", ex.getMessage());
}
catch (Exception e1) {
fl.ecritLigne("Ouverture recherche - Erreur", e1.getMessage());
}
}
class SortedTableModel extends AbstractTableModel
implements ListSelectionListener {
// Colonne sur laquelle s'effectue le tri
int keyColumn = 0;
// Modèle qui gère vraiment les données
private TableModel model;
// Correspondance entre la vue et le modèle :
// modelRows[i] donne quelle ligne du modèle doit afficher
// la ligne n°i de la vue.
private Row[] modelRows;
// Chaque objet Row contient un numéro
class Row implements Comparable {
private int row; // n° de la ligne dans le modèle
// Constructeur
Row(int row) { this.row = row; }
// Retourne n° de la ligne dans le modèle
int getRow() { return row; }
// Comparaison de deux lignes
// On compare les contenus des cellules de la colonne
// keyColumn
public int compareTo(Object other) {
Row r = (Row) other;
Object cellule1 = model.getValueAt(row, keyColumn);
Object cellule2 = model.getValueAt(r.row, keyColumn);
return ((Comparable) cellule1).compareTo(cellule2);
}
}
// Constructeur
SortedTableModel(TableModel model) {
this.model = model;
modelRows = new Row[model.getRowCount()];
// Au départ les lignes ne sont pas triées.
// La ligne modelRows[i] pointe donc sur la ligne n° i.
for (int i = 0; i < modelRows.length; i++)
modelRows[i] = new Row(i);
}
// Accès à une cellule
public Object getValueAt(int row, int column) {
return model.getValueAt(modelRows[row].getRow(), column);
}
// Nombre de lignes : délégation
public int getRowCount() { return model.getRowCount(); }
// Nombre de colonnes : délégation
public int getColumnCount() { return model.getColumnCount(); }
// Entêtes des colonnes : délégation
public String getColumnName(int column) {
return model.getColumnName(column);
}
// Classe des objets
public Class getColumnClass(int column) {
return model.getColumnClass(column);
}
// Écoute des événements de sélection
public void valueChanged(ListSelectionEvent e) {
System.out.println("valueChanged");
// Modèle de sélection de la table qui a émis l'événement
ListSelectionModel lsm = (ListSelectionModel) e.getSource();
// Tri selon la colonne sélectionnée
if (!e.getValueIsAdjusting() && !lsm.isSelectionEmpty()) {
// Colonne sélectionnée
keyColumn = lsm.getMinSelectionIndex();
// Tri des lignes suivant cette colonne
Arrays.sort(modelRows);
// Avertissement de la vue
fireTableDataChanged();
}
}
}
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
benohite
Messages postés210Date d'inscriptionvendredi 11 avril 2003StatutMembreDernière intervention18 décembre 20037 26 août 2003 à 15:54
non c normal c moi qui me suis planté
essaye plutot:
sortedModel.fireTableDataChanged();
tu dois pour cela declaré ton SortedTableModel sortedModel en tant que public ou private avant ton constructeur
public class fenRecherche extends JInternalFrame {
JTextField jtfNom = new JTextField();
JTextField jtfPrenom = new JTextField();
String[] columnNames = {"Nom" , "Prénom" , "Sexe" , "Date de naiss."};
String[][] data ;
JTable jtRechPatient ;
journal fl = new journal ("d:\\TEMP\\Visage.log");
TableModel baseModel ;
SortedTableModel sortedModel;
public int nbLigne (ResultSet rs) {
int i = 0;
try {
for (; rs.next(); ) {
++i;
}
}
catch (SQLException ex) {
fl.ecritLigne("nbLigne", ex.getMessage());
i = -1;
}
return i;
}
public fenRecherche(String titre, String sSql) {
this.setTitle(titre);
this.setMaximizable(true);
this.setClosable(true);
this.setSize(800, 400);
this.setResizable(true);
this.setVisible(true);
this.setToolTipText("Recherche d'un patient");
int i = 0;
int a = 0;
try {
ResultSet rRetour = gestionDB.reqSelect(sSql);
ResultSet rRetour2 = gestionDB.reqSelect(sSql);
int nbLigneSelect = nbLigne(rRetour);
data = new String [nbLigneSelect][4];
rRetour.close();
String sSql = "Select nom, prenom, sexe, datenaiss from patient";
fl.ecritLigne("-" + sNom + "-");
if (sNom != "") {
sSql = sSql + " where nom like '%" + sNom + "%'";
}
fl.ecritLigne("-" + sPrenom + "-");
/*
if (sPrenom != "") {
sSql = sSql + " where prenom like '%" + sPrenom + "%'";
}
*/
fl.ecritLigne(sSql);
data = raffraichitTab(sSql);
sortedModel.fireTableDataChanged();
}
String[][] raffraichitTab (String sSql){
int i = 0;
int a = 0;
try {
ResultSet rRetour = gestionDB.reqSelect(sSql);
ResultSet rRetour2 = gestionDB.reqSelect(sSql);
int nbLigneSelect = nbLigne(rRetour);
String[][] data = new String [nbLigneSelect][4];
rRetour.close();
class SortedTableModel extends AbstractTableModel
implements ListSelectionListener {
// Colonne sur laquelle s'effectue le tri
int keyColumn = 0;
// Modèle qui gère vraiment les données
private TableModel model;
// Correspondance entre la vue et le modèle : modelRows[i] donne quelle ligne du modèle doit afficher la ligne n°i de la vue.
private Row[] modelRows;
// Chaque objet Row contient un numéro
class Row implements Comparable {
private int row; // n° de la ligne dans le modèle
// Constructeur
Row(int row) { this.row = row; }
// Retourne n° de la ligne dans le modèle
int getRow() { return row; }
// Comparaison de deux lignes
// On compare les contenus des cellules de la colonne
// keyColumn
public int compareTo(Object other) {
Row r = (Row) other;
Object cellule1 = model.getValueAt(row, keyColumn);
Object cellule2 = model.getValueAt(r.row, keyColumn);
return ((Comparable) cellule1).compareTo(cellule2);
}
}
// Constructeur
SortedTableModel(TableModel model) {
this.model = model;
modelRows = new Row[model.getRowCount()];
// Au départ les lignes ne sont pas triées.
// La ligne modelRows[i] pointe donc sur la ligne n° i.
for (int i = 0; i < modelRows.length; i++)
modelRows[i] = new Row(i);
}
// Accès à une cellule
public Object getValueAt(int row, int column) {
return model.getValueAt(modelRows[row].getRow(), column);
}
// Nombre de lignes : délégation
public int getRowCount() { return model.getRowCount(); }
// Nombre de colonnes : délégation
public int getColumnCount() { return model.getColumnCount(); }
// Entêtes des colonnes : délégation
public String getColumnName(int column) {
return model.getColumnName(column);
}
// Classe des objets
public Class getColumnClass(int column) {
return model.getColumnClass(column);
}
// Écoute des événements de sélection
public void valueChanged(ListSelectionEvent e) {
System.out.println("valueChanged");
// Modèle de sélection de la table qui a émis l'événement
ListSelectionModel lsm = (ListSelectionModel) e.getSource();
// Tri selon la colonne sélectionnée
if (!e.getValueIsAdjusting() && !lsm.isSelectionEmpty()) {
// Colonne sélectionnée
keyColumn = lsm.getMinSelectionIndex();
// Tri des lignes suivant cette colonne
Arrays.sort(modelRows);
// Avertissement de la vue
fireTableDataChanged();
}
}
}
}
benohite
Messages postés210Date d'inscriptionvendredi 11 avril 2003StatutMembreDernière intervention18 décembre 20037 26 août 2003 à 16:56
ok essaye de creer dans ta classe SortedTableModel une methode qui balaye ton tableau de donnee avec deux boucles for afin d afficher ces donnees, ainsi tui appelles cette methode au lieu de sortedModel.firetable..... et tu verras si tes donnees de model sont mise a jour ou non
ainsi on saura deja d ou viens le pb, du modele ou de la jtable