Rafraîchissement de JTable

cs_Kloun Messages postés 23 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 23 octobre 2003 - 26 août 2003 à 08:05
cs_Kloun Messages postés 23 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 23 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

11 réponses

benohite Messages postés 210 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 18 décembre 2003 7
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)

...etc mais la plus interessante reste:

fireTableDataChanged()

voila j espere que ca t aidera

benohite
:big)
0
cs_Kloun Messages postés 23 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 23 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 ...
0
benohite Messages postés 210 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 18 décembre 2003 7
26 août 2003 à 14:44
peux tu poster ton code ici cela nous aidera a y voir plus clair et a te donner une meilleure reponse

benohite
:big)
0
cs_Kloun Messages postés 23 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 23 octobre 2003
26 août 2003 à 15:15
Le code (On est prié de ne pas sauter au plafond devant l'horreur...) :

import java.util.*;
import java.awt.*;
import javax.swing.*;
import java.sql.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.awt.event.*;

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();

for (; rRetour2.next(); ) {
data[a][0] = rRetour2.getString(1);
data[a][1] = rRetour2.getString(2);
data[a][2] = rRetour2.getString(3);
data[a][3] = rRetour2.getString(4);
fl.ecritLigne("Avant");
if (data[a][3] != null) {
fl.ecritLigne("Après 1");
String[] tab = data[a][3].split("-");
String sDateNaiss = tab[2] + "/" + tab[1] + "/" + tab[0];
data[a][3] = sDateNaiss;
}
else {
fl.ecritLigne("Après 2");
data[a][3] = "Non renseignée";
}
++a;
}
}
catch (SQLException ex) {
fl.ecritLigne("Ouverture recherche - Erreur", ex.getMessage());
}
catch (Exception e1) {
fl.ecritLigne("Ouverture recherche - Erreur", e1.getMessage());
}

baseModel = new DefaultTableModel(data, columnNames);
SortedTableModel sortedModel = new SortedTableModel(baseModel);
JTable jtRechPatient = new JTable(sortedModel);
jtRechPatient.setRowSelectionAllowed(false);
jtRechPatient.setColumnSelectionAllowed(true);
jtRechPatient.getColumnModel().getSelectionModel().addListSelectionListener(sortedModel);

JPanel jpIdentite = new JPanel();
jpIdentite.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder("Recherche"),BorderFactory.createEmptyBorder(10, 10, 10, 10)));
jpIdentite.setLayout(new GridLayout(4, 1));

JLabel jlNom = new JLabel("Nom");
JLabel jlPrenom = new JLabel("Prénom");
JButton jbRechercher = new JButton();
jbRechercher.setText("Rechercher");
jbRechercher.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
jbRechercher_actionPerformed(e);
}
});
jpIdentite.setToolTipText("Recherche");
jpIdentite.add(jtRechPatient);
jpIdentite.add(jbRechercher);
jpIdentite.add(jlNom);
jpIdentite.add(jtfNom);
jpIdentite.add(jlPrenom);
jpIdentite.add(jtfPrenom);

this.getContentPane().add(jpIdentite);
}

void jbRechercher_actionPerformed(ActionEvent e) {
journal fl = new journal ("d:\\TEMP\\Visage.log");
String sNom = jtfNom.getText();
String sPrenom = jtfPrenom.getText();

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();

for (; rRetour2.next(); ) {
data[a][0] = rRetour2.getString(1);
data[a][1] = rRetour2.getString(2);
data[a][2] = rRetour2.getString(3);
data[a][3] = rRetour2.getString(4);
fl.ecritLigne("Avant");
if (data[a][3] != null) {
fl.ecritLigne("Après 1");
String[] tab = data[a][3].split("-");
fl.ecritLigne("Après 1.1");
String sDateNaiss = tab[2] + "/" + tab[1] + "/" + tab[0];
fl.ecritLigne("Après 1.2");
data[a][3] = sDateNaiss;
fl.ecritLigne("Après 1.3");
}
else {
fl.ecritLigne("Après 2");
data[a][3] = "Non renseignée";
}
++a;
}
fl.ecritLigne("Après 3");

////////////////////////////
// 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();
}
}
}
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
benohite Messages postés 210 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 18 décembre 2003 7
26 août 2003 à 15:32
c vrai que c est un peu comment dire confud ;-) mais ca va, ca se laisse comprendre (enfin j crois)

essaye de mettre a la fin de ta fonction raffraichitTab()
jtRechPatient.getModel.fireTableDataChanged();

benohite
:big)
0
cs_Kloun Messages postés 23 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 23 octobre 2003
26 août 2003 à 15:46
Merci,
mais il doit me manquer autre chose, lejtRechPatient.getModel() ne me propose pas le fireTableDataChanged() ?!?
0
benohite Messages postés 210 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 18 décembre 2003 7
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

benohite
:big)
0
cs_Kloun Messages postés 23 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 23 octobre 2003
26 août 2003 à 16:33
Bon, y'a quelque chose qui doit encore m'échapper parce qu'il ne se passe rien (pas de problème, mais la table n'est pas mise à jour ...)
0
cs_Kloun Messages postés 23 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 23 octobre 2003
26 août 2003 à 16:49
Ah ben si, il se passe quelque chose : ça boucle et sa plante ...

import java.util.*;
import java.awt.*;
import javax.swing.*;
import java.sql.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.awt.event.*;
import javax.swing.table.AbstractTableModel.*;

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();

for (; rRetour2.next(); ) {
data[a][0] = rRetour2.getString(1);
data[a][1] = rRetour2.getString(2);
data[a][2] = rRetour2.getString(3);
data[a][3] = rRetour2.getString(4);
if (data[a][3] != null) {
String[] tab = data[a][3].split("-");
String sDateNaiss = tab[2] + "/" + tab[1] + "/" + tab[0];
data[a][3] = sDateNaiss;
}
else {
fl.ecritLigne("Après 2");
data[a][3] = "Non renseignée";
}
++a;
}
}
catch (SQLException ex) {
fl.ecritLigne("Ouverture recherche - Erreur", ex.getMessage());
}
catch (Exception e1) {
fl.ecritLigne("Ouverture recherche - Erreur", e1.getMessage());
}

baseModel = new DefaultTableModel(data, columnNames);
sortedModel = new SortedTableModel(baseModel);
JTable jtRechPatient = new JTable(sortedModel);
jtRechPatient.setRowSelectionAllowed(false);
jtRechPatient.setColumnSelectionAllowed(true);
jtRechPatient.getColumnModel().getSelectionModel().addListSelectionListener(sortedModel);

jtRechPatient.getModel().addTableModelListener(new javax.swing.event.TableModelListener() {
public void tableChanged(TableModelEvent e) {
System.out.println("tableChanged 1");
sortedModel.fireTableDataChanged(); }
});

JPanel jpIdentite = new JPanel();
jpIdentite.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder("Recherche"),BorderFactory.createEmptyBorder(10, 10, 10, 10)));
jpIdentite.setLayout(new GridLayout(4, 1));

JLabel jlNom = new JLabel("Nom");
JLabel jlPrenom = new JLabel("Prénom");
JButton jbRechercher = new JButton();
jbRechercher.setText("Rechercher");
jbRechercher.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
jbRechercher_actionPerformed(e);
}
});
jpIdentite.setToolTipText("Recherche");
jpIdentite.add(jtRechPatient);
jpIdentite.add(jbRechercher);
jpIdentite.add(jlNom);
jpIdentite.add(jtfNom);
jpIdentite.add(jlPrenom);
jpIdentite.add(jtfPrenom);

this.getContentPane().add(jpIdentite);
}

void jbRechercher_actionPerformed(ActionEvent e) {
journal fl = new journal ("d:\\TEMP\\Visage.log");
String sNom = jtfNom.getText();
String sPrenom = jtfPrenom.getText();

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();

for (; rRetour2.next(); ) {
data[a][0] = rRetour2.getString(1);
data[a][1] = rRetour2.getString(2);
data[a][2] = rRetour2.getString(3);
data[a][3] = rRetour2.getString(4);
if (data[a][3] != null) {
String[] tab = data[a][3].split("-");
String sDateNaiss = tab[2] + "/" + tab[1] + "/" + tab[0];
data[a][3] = sDateNaiss;
}
else {
data[a][3] = "Non renseignée";
}
++a;
}
}
catch (SQLException ex) {
fl.ecritLigne("Ouverture recherche - Erreur", ex.getMessage());
}
catch (Exception e1) {
fl.ecritLigne("Ouverture recherche - Erreur", e1.getMessage());
}
return data;
}

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();
}
}
}
}
0
benohite Messages postés 210 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 18 décembre 2003 7
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

benohite
:big)
0
cs_Kloun Messages postés 23 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 23 octobre 2003
26 août 2003 à 17:37
Je pense qu'il y a effectivement un pb avec la JTable : le header ne s'affiche jamais.
0
Rejoignez-nous