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