cours0708/workspace/RequeteSimple/fr/blankoworld/donnees/JTableModel.java
2008-11-25 22:11:16 +01:00

224 lines
6.9 KiB
Java

package fr.blankoworld.donnees;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import java.awt.Dimension;
import java.awt.GridLayout;
import fr.blankoworld.connexionBDD.Connexion;
public class JTableModel extends JPanel {
private static final long serialVersionUID = 1L;
// Utilise pour le debugage, lors de l'insertion de donnees (modification)
// private boolean DEBUG = false;
public JTableModel(Connexion connectionObject, String requete) {
super(new GridLayout(1,0));
JTable table = new JTable(new MyTableModel(connectionObject, requete));
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);
// Ajout de la table dans un panneau deroulant.
JScrollPane scrollPane = new JScrollPane(table);
//Ajout du panneau deroulant dans ce panneau ci.
add(scrollPane);
}
class MyTableModel extends AbstractTableModel {
private static final long serialVersionUID = 1L;
private String[] columnNames;
private Object[][] data;
public MyTableModel(Connexion connectionObject, String requete){
ResultSet resultat = connectionObject.getQueryResult();
try {
// On catalogue l'ensemble des donnees relatives a la table resultante (pas le contenu mais les donnees de colonnes, et le nombre de lignes)
ResultSetMetaData rsmd = resultat.getMetaData();
// Nombre de colonnes (Commence a 1 !)
int i = rsmd.getColumnCount();
// Donner les entetes de colonnes
String[] enteteColonnes = new String[i];
for (int j = 1; j < i + 1; j++) {
enteteColonnes[j - 1] = rsmd.getColumnName(j);
}
// Nombre de lignes
int nbreLigne = 0;
while (resultat.next()){
nbreLigne++;
}
// Tableau de donnees
Object[][] tableauDonnees = new Object[nbreLigne][i];
for(int ligne = 0; ligne < nbreLigne; ligne++){
for(int colonne = 0; colonne < i; colonne++){
tableauDonnees[ligne][colonne] = "";
}
}
//On refait la requete qui semble avoir fonctionne la premiere fois
connectionObject.sendQuery(requete);
ResultSet donnees = connectionObject.getQueryResult();
// Incrementeur de ligne
int incrementeur = 0;
while (donnees.next()) {
//traitement des autres lignes
for (int j = 1; j < i + 1; j++) {
tableauDonnees[incrementeur][j - 1] = donnees.getObject(j);
}
incrementeur++;
}
columnNames = enteteColonnes;
data = tableauDonnees;
} catch (SQLException e) {
// On remplit par des tableaux vides
columnNames = null;
data = null;
}
// // Jeux de tests (pour voir si cela fonctionne)
// columnNames = new String[] {"First Name",
// "Last Name",
// "Sport",
// "# of Years",
// "Vegetarian"};
//
// data = new Object[][] {
// {"Mary", "Campione",
// "Snowboarding", new Integer(5), new Boolean(false)},
// {"Alison", "Huml",
// "Rowing", new Integer(3), new Boolean(true)},
// {"Kathy", "Walrath",
// "Knitting", new Integer(2), new Boolean(false)},
// {"Sharon", "Zakhour",
// "Speed reading", new Integer(20), new Boolean(true)},
// {"Philip", "Milne",
// "Pool", new Integer(10), new Boolean(false)}
// };
}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
/*
* Commentaire donne par Sun, concernant les prochaines methodes
* JTable uses this method to determine the default renderer/
* editor for each cell. If we didn't implement this method,
* then the last column would contain text ("true"/"false"),
* rather than a check box.
*/
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
/*
* Don't need to implement this method unless your table's
* editable.
*/
// public boolean isCellEditable(int row, int col) {
// //Note that the data/cell address is constant,
// //no matter where the cell appears onscreen.
// if (col < 2) {
// return false;
// } else {
// return true;
// }
// }
/*
* Don't need to implement this method unless your table's
* data can change.
*/
// public void setValueAt(Object value, int row, int col) {
// if (DEBUG) {
// System.out.println("Setting value at " + row + "," + col
// + " to " + value
// + " (an instance of "
// + value.getClass() + ")");
// }
//
// data[row][col] = value;
// fireTableCellUpdated(row, col);
//
// if (DEBUG) {
// System.out.println("New value of data:");
// printDebugData();
// }
// }
// private void printDebugData() {
// int numRows = getRowCount();
// int numCols = getColumnCount();
//
// for (int i=0; i < numRows; i++) {
// System.out.print(" row " + i + ":");
// for (int j=0; j < numCols; j++) {
// System.out.print(" " + data[i][j]);
// }
// System.out.println();
// }
// System.out.println("--------------------------");
// }
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
// private static void createAndShowGUI() {
// //Create and set up the window.
// JFrame frame = new JFrame("TableDemo");
// frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//
// //Create and set up the content pane.
// JTableModel newContentPane = new JTableModel();
// newContentPane.setOpaque(true); //content panes must be opaque
// frame.setContentPane(newContentPane);
//
// //Display the window.
// frame.pack();
// frame.setVisible(true);
// }
//
// public static void main(String[] args) {
// //Schedule a job for the event-dispatching thread:
// //creating and showing this application's GUI.
// javax.swing.SwingUtilities.invokeLater(new Runnable() {
// public void run() {
// createAndShowGUI();
// }
// });
// }
}