Aller au menu - Aller au contenu

Icône TP : un testeur de requête

Mise à jour : 17/06/2009
Difficulté : Difficile Difficile Creative Commons BY-NC-SA
3 526 visites depuis 7 jours, dont 163 sur ce chapitre classé 45/786
Bon, vous avez appris un tas de choses et il est grand temps de faire un peu de pratique !

Dans ce TP, je vais vous demander de réaliser un testeur de requête SQL... Vous ne voyez pas où je veux en venir ? Lisez donc la suite... :pirate:
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Cahier des charges

Alors... Le but du jeu est de :
  • pouvoir avoir une IHM permettant la saisie d'une requête SQL dans un champ ;
  • lancer l'exécution de la requête grâce à un bouton ;
  • ce bouton devra être dans une barre d'outils ;
  • dans le cas où la requête renvoie 0 ou plusieurs résultats, afficher ceux-ci dans un JTable ;
  • le nom des colonnes devra être visible ;
  • en cas d'erreur, une pop-up (JOptionPane) contenant le message s'affichera ;
  • un petit message affichera le temps d'exécution de la requête ainsi que le nombre de lignes retournées en bas de fenêtre.

Vous avez de quoi faire, ici...
Bon, si vous ne savez pas comment faire pour le temps d'exécution de la requête, je vous donne un indice : System.currentTimeMillis(); retourne un long...

Pour les ZérOs n'ayant pas lu la partie événementielle du tuto Java, je vous autorise à faire une version en mode console ; par contre, celle-ci n'aura pas de correction... ^^

Quelques captures d'écran

Bon... Voici ce que j'ai obtenu avec mon code. Inspirez-vous en pour faire votre programme...

Image utilisateur Image utilisateur Image utilisateur


Je n'ai plus qu'à vous souhaiter bonne chance et bon courage !
Let's go !

Correction

DONG !
Le temps imparti est écoulé !
Bon : comme toujours, il s'agit d'une correction possible et non pas de LA CORRECTION !

J'espère que vous vous êtes bien pris la tête sur ce TP. Bien sûr, pas dans le sens où il vous a torturé l'esprit durant des heures jusqu'à vous rendre malades, mais plutôt dans le sens où celui-ci vous a permis de réfléchir et de découvrir des choses. :)

Bon, assez tergiversé, vous devez être impatient de voir ce que j'ai fait :

Secret (cliquez pour afficher)
Classe SdzConnection.java :

Code : Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.sdz.connection;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import javax.swing.JOptionPane;

public class SdzConnection{

	/**
	 * URL de connection
	 */
	private static String url = "jdbc:postgresql://localhost:5432/Ecole";
	/**
	 * Nom du user
	 */
	private static String user = "postgres";
	/**
	 * Mot de passe du user
	 */
	private static String passwd = "postgres";
	/**
	 * Objet Connection
	 */
	private static Connection connect;
	
	/**
	 * Méthode qui va retourner notre instance
	 * et la créer si elle n'existe pas...
	 * @return
	 */
	public static Connection getInstance(){
		if(connect == null){
			try {
				connect = DriverManager.getConnection(url, user, passwd);
			} catch (SQLException e) {
				JOptionPane.showMessageDialog(null, e.getMessage(), "ERREUR DE CONNEXION ! ", JOptionPane.ERROR_MESSAGE);
			}
		}		
		return connect;	
	}
}


Classe Fenetre.java


Code : Java
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
package com.sdz.tp;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JToolBar;

import com.sdz.connection.SdzConnection;

public class Fenetre extends JFrame {

	/**
	 * ToolBar pour le lancement des requêtes
	 */
	private JToolBar tool = new JToolBar();
	/**
	 * Le bouton
	 */
	private JButton load = new JButton(new ImageIcon("img/load.png"));
	/**
	 * Le délimiteur
	 */
	private JSplitPane split;
	/**
	 * Le conteneur de résultat
	 */
	private JPanel result = new JPanel();
	/**
	 * Requête par défaut pour le démarrage
	 */
	private String requete = "SELECT  * FROM classe";
	/**
	 * Le composant dans lequel taper la requête
	 */
	private JTextArea text = new JTextArea(requete);
		
	/**
	 * Constructeur
	 */
	public Fenetre(){
		setSize(900, 600);
		setTitle("TP JDBC");
		setLocationRelativeTo(null);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		initToolbar();
		initContent();
		initTable(requete);
	}
	
	/**
	 * Initialise la toolbar
	 */
	private void initToolbar(){
		load.setPreferredSize(new Dimension(30, 35));
		load.setBorder(null);
		load.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent event){
				initTable(text.getText());
			}
		});
		
		tool.add(load);
		getContentPane().add(tool, BorderLayout.NORTH);
	}
	
	/**
	 * Initialise le contenu de la fenêtre
	 */
	public void initContent(){
		//Vous connaissez ça...
		result.setLayout(new BorderLayout());
		split = new JSplitPane(JSplitPane.VERTICAL_SPLIT, new JScrollPane(text), result);
		split.setDividerLocation(100);
		getContentPane().add(split, BorderLayout.CENTER);		
	}
	
	/**
	 * Initialise le visuel avec la requête saisie dans l'éditeur
	 * @param query
	 */
	public void initTable(String query){
		
		try {
			//On crée un statement
			long start = System.currentTimeMillis();
			Statement state = SdzConnection.getInstance()
											.createStatement(
														ResultSet.TYPE_SCROLL_INSENSITIVE, 
														ResultSet.CONCUR_READ_ONLY
											);
			
			//On exécute la requête
			ResultSet res = state.executeQuery(query);
			//Temps d'exécution
			
			//On récupère les meta afin de récupérer le nom des colonnes
			ResultSetMetaData meta = res.getMetaData();
			//On initialise un tableau d'Object pour les en-têtes du tableau
			Object[] column = new Object[meta.getColumnCount()];
			
			for(int i = 1 ; i <= meta.getColumnCount(); i++){
				column[i-1] = meta.getColumnName(i);
			}
			
			//Petite manipulation pour obtenir le nombre de lignes
			res.last();
			int rowCount = res.getRow();
			Object[][] data = new Object[res.getRow()][meta.getColumnCount()];
			
			//On revient au départ
			res.beforeFirst();
			int j = 1;
			
			//On remplit le tableau d'Object[][]
			while(res.next()){
				for(int i = 1 ; i <= meta.getColumnCount(); i++)
					data[j-1][i-1] = res.getObject(i);
				
				j++;
			}
			
                        //on ferme le tout                         
			res.close();
			state.close();

			long totalTime = System.currentTimeMillis() - start;
			
			//On enlève le contenu de notre conteneur
			result.removeAll();
			//On y ajoute un JTable
			result.add(new JScrollPane(new JTable(data, column)), BorderLayout.CENTER);
			result.add(new JLabel("La requête à été exécuter en " + totalTime + " ms et a retourné " + rowCount + " ligne(s)"), BorderLayout.SOUTH);
			//On force la mise à jour de l'affichage
			result.revalidate();
			
		} catch (SQLException e) {
			//Dans le cas d'une exception, on affiche une pop-up et on efface le contenu		
			result.removeAll();
			result.add(new JScrollPane(new JTable()), BorderLayout.CENTER);
			result.revalidate();
			JOptionPane.showMessageDialog(null, e.getMessage(), "ERREUR ! ", JOptionPane.ERROR_MESSAGE);
		}	
		
	}
	
	/**
	 * Point de départ du programme
	 * @param args
	 */
	public static void main(String[] args){
		Fenetre fen = new Fenetre();
		fen.setVisible(true);
	}
	
}


Bien sûr, ce code n'est pas la perfection même, vous pouvez l'améliorer grandement !
Vous pouvez utiliser un autre composant que moi pour la saisie de la requête, un JTextPane par exemple : pour la coloration syntaxique... ;)
Vous pourriez avoir un menu qui vous permette de sauvegarder vos requêtes, un tableau interactif autorisant la modification des données...
Bref, ce n'est pas les améliorations qui manquent. :-°
Un TP assez riche et qui a dû vous demander quelques instants de réflexion... :diable:
Mais bon, rien d'insurmontable pour les ZérOs avertis que vous êtes.

Je vous propose maintenant de voir comment faire en sorte d'utiliser des objets Java correspondant à vos données dans votre BDD !
J'imagine que vous aspirez à faire ceci depuis longtemps... Alors, rendez-vous au prochain chapitre ! :)
Chapitre précédent Sommaire Chapitre suivant

Partager

3 commentaires pour "TP : un testeur de requête"
Note moyenne : 3.34 / 4 (178 votes)
Pseudo Commentaire
Hors ligne Jambo2 # Posté le 12/05/2009 à 13:23:46

Cysboy je t'aime :D

:-°
Hors ligne softdounia # Posté le 27/08/2009 à 01:12:48
A
Avatar

Ville : Alger
Pays : Algérie
Études : ETS Montréal

Merci super le tp

Voila ma Solution, votre avis et critique son les bienvenu

je l’ai posté sur le forum:
http://www.siteduzero.com/forum-83-438 [...] -de-mvc.html#

Secret (cliquez pour afficher)

class Fenetre
Code : Java
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
package com.sdz.vu;

import com.sdz.controleurs.Console;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JCheckBox;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.table.AbstractTableModel;


public class Fenetre extends JFrame {

	private JTable tableau;
	private JPanel resultSqlRequet = new JPanel();
	private String supp = "Supprimer la ligne";
	private String newRequetSql = "SELECT * FROM professeur";
	private Console dataBD;
	private JTextArea jta = new JTextArea(newRequetSql);

	public Fenetre(){
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setTitle("JTable");
		this.setSize(800, 450);
		
		this.initTable(this.newRequetSql);
		this.createContent();
	}

	private void createContent(){
		
	    //On enlève le contenu de notre conteneur
		resultSqlRequet.removeAll();
		
	    resultSqlRequet.setLayout(new BorderLayout());
	    this.getContentPane().add( resultSqlRequet);
	    
	    JButton exeSql = new JButton("Executer");
	    exeSql.addActionListener(new ExecListener());
		JButton ajouter = new JButton("Ajouter une ligne");
		ajouter.addActionListener(new MoreListener());		
		
		resultSqlRequet.add(exeSql, BorderLayout.EAST);
			
		resultSqlRequet.add(jta, BorderLayout.NORTH);
		
		resultSqlRequet.add(ajouter, BorderLayout.SOUTH);
		

		//On ajoute le tableau
		resultSqlRequet.add( (new JScrollPane(this.tableau)), BorderLayout.CENTER);
		//On force la mise à jour de l'affichage
		resultSqlRequet.revalidate();
		
	}
	
	private void initTable(String newRequetSql){
	
		this.dataBD = new Console(newRequetSql);
		String  title[];
		Object[][] data;
		
		title = dataBD.getTitle();
		data = dataBD.getData();
		
		//Nous devons utiliser un modèle d'affichage spécifique afin de pallier aux bugs d'affichage !
		ZModel zModel = new ZModel(data, title);
		this.tableau = new JTable(zModel);
		
		this.tableau.setRowHeight(20);
		this.tableau.getColumn("Suppression").setCellEditor(new DeleteButtonEditor(new JCheckBox()));
	}

	class ZModel extends AbstractTableModel{

		private Object[][] data;
		private String[] title;
		/**
		 * Constructeur
		 * @param data
		 * @param title
		 */
		public ZModel(Object[][] data, String[] title){
			this.data = data;
			this.title = title;
		}
		/**
		* Retourne le titre de la colonne à l'indice spécifé
		*/
		public String getColumnName(int col) {
		  return this.title[col];
		}

		/**
		 * Retourne le nombre de colonnes
		 */
		public int getColumnCount() {
			return this.title.length;
		}

		/**
		 * Retourne le nombre de lignes
		 */
		public int getRowCount() {
			return this.data.length;
		}

		/**
		 * Retourne la valeur à l'emplacement spécifié
		 */
		public Object getValueAt(int row, int col) {
			return this.data[row][col];
		}

		/**
		 * Défini la valeur à l'emplacement spécifié
		 */
		public void setValueAt(Object value, int row, int col) {
			//On interdit la modification sur certaine colonne !
			if( !this.getColumnName(col).equals("Suppression")) //!this.getColumnName(col).equals("Age") &&
				this.data[row][col] = value;
		}

		/**
		* Retourne la classe de la donnée de la colonne
		* @param col
		*/
		public Class getColumnClass(int col){
			//On retourne le type de la cellule à la colonne demandée
			//On se moque de la ligne puisque les données sur chaque ligne sont les mêmes
			//On choisit donc la première ligne
			
		return this.data[0][col].getClass() ;
		} 

		/**
		 * Méthode permettant de retirer une ligne du tableau
		 * @param position
		 */
		public void removeRow(int position){

			int indice = 0, indice2 = 0, nbRow = this.getRowCount()-1, nbCol = this.getColumnCount();
			Object temp[][] = new Object[nbRow][nbCol];

			for(Object[] value : this.data){
				if(indice != position){
					temp[indice2++] = value;
				}
				System.out.println("Indice = " + indice);
				indice++;
			}
			this.data = temp;
			temp = null;
			//Cette méthode permet d'avertir le tableau que les données ont été modifiées
			//Ce qui permet une mise à jours complète du tableau
			this.fireTableDataChanged();
		}

		/**
		 * Permet d'ajouter une ligne dans le tableau
		 * @param data
		 */
		public void addRow(Object[] data){
			int indice = 0, nbRow = this.getRowCount(), nbCol = this.getColumnCount();

			Object temp[][] = this.data;
			this.data = new Object[nbRow+1][nbCol];

			for(Object[] value : temp)
				this.data[indice++] = value;


			this.data[indice] = data;
			temp = null;
			//Cette méthode permet d'avertir le tableau que les données ont été modifiées
			//Ce qui permet une mise à jours complète du tableau
			this.fireTableDataChanged();
		}


		public boolean isCellEditable(int row, int col){
			return true;
		}
	}

	
	class MoreListener implements ActionListener{
		public void actionPerformed(ActionEvent event) {
			Object[] donnee = new Object[dataBD.getTitle().length];  //, comboData[0], new Boolean(false)
			int i = 0;
			for(; i < dataBD.getTitle().length - 1; i++)
			{ donnee[i] = "vide"; }
			  donnee[i] = supp;
				
			((ZModel)tableau.getModel()).addRow(donnee);
		}
	}
	
	class ExecListener implements ActionListener{
		public void actionPerformed(ActionEvent event) {
			initTable(jta.getText());
			createContent();
		}
	}	

	public static void main(String[] args){
		Fenetre fen = new Fenetre();
		fen.setVisible(true);
	}

	/**
	 * @return the newRequetSql
	 */
	public String getNewRequetSql() {
		return newRequetSql;
	}

	/**
	 * @return the dataBD
	 */
	public Console getDataBD() {
		return dataBD;
	}

	/**
	 * @param dataBD the dataBD to set
	 */
	public void setDataBD(Console dataBD) {
		this.dataBD = dataBD;
	}
}


class SdzConnection
Code : Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.sdz.connection;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.swing.JOptionPane;

public class SdzConnection{

	/**
	 * URL de connection
	 */
	private static String url = "jdbc:postgresql://localhost:5432/ecole";
	/**
	 * Nom du user
	 */
	private static String user = "postgres";
	/**
	 * Mot de passe du user
	 */
	private static String passwd = "******";
	/**
	 * Objet Connection
	 */
	private static Connection connect;

	/**
	 * Méthode qui va nous retourner notre instance
	 * et la créer si elle n'existe pas...
	 * @return
	 */
	public static Connection getInstance(){
		if(connect == null){
			try {
				connect = DriverManager.getConnection(url, user, passwd);
			} catch (SQLException e) {
                JOptionPane.showMessageDialog(null, e.getMessage(), "ERREUR DE CONNEXION ! ", JOptionPane.ERROR_MESSAGE);
				e.printStackTrace();
			}
		}
		return connect;
	}
}


class Console
Code : Java
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
package com.sdz.controleurs;

import com.sdz.connection.SdzConnection;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;

import javax.swing.JOptionPane;

/**
 * @author B.REDOUANE
 */
public class Console {

 private Connection conn = SdzConnection.getInstance();
 private Object[][] data;
 private String  title[]; 
 
	public Console(String requeteSql) {

		try {
			Connection conn = SdzConnection.getInstance();

			//Création d'un objet Statement
			Statement state = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
			//L'objet ResultSet contient le résultat de la requête SQL
			ResultSet result = state.executeQuery(requeteSql);
			
			//On récupère les MetaData
			ResultSetMetaData resultMeta = result.getMetaData();
			
			this.title = new String[resultMeta.getColumnCount() + 1];
			//Petite manipulation pour obtenir le nombre de lignes
			result.last();
			int rowCount = result.getRow();
			
			this.data = new Object[result.getRow()][resultMeta.getColumnCount()+1];
			//On revient au départ
			result.beforeFirst();

			System.out.println("\n**********************************");
			//On affiche le nom des colonnes
			for(int i = 1; i <=  resultMeta.getColumnCount(); i++)
				System.out.print("\t" + resultMeta.getColumnName(i).toUpperCase() + "\t *");

		    int k =0;
			for(; k < resultMeta.getColumnCount(); k++)
			{  //System.out.println("la lign["+k+"]= "+ dataBD.getResultMetaData().getColumnName(i+1).toUpperCase() );
				this.title[k] = resultMeta.getColumnName(k+1).toUpperCase(); 
			} 
			this.title[k] = "Suppression";
			
			System.out.println("\n**********************************");

		    //On remplit le tableau d'Object[][]
			int j = 1;
			while(result.next()){
				int i = 1;
				for(; i <= resultMeta.getColumnCount(); i++){
					System.out.print("\t" + result.getObject(i).toString() + "\t |");
				    this.data[j-1][i-1] = result.getObject(i).toString();
				 }
				  this.data[j-1][i-1]  = "Supprimer la ligne";
				    System.out.println("\n---------------------------------");
			j++;	    
			}
			
 /*Remarque: l'utilisation de result Avec "next" que 1 seul fois siNon c'est FAUX*/	
        /*    int j = 1;
			while(result.next()){
			 int i = 1;
			 for(; i <= resultMeta.getColumnCount(); i++) {
				System.out.print("\t" + result.getObject(i).toString() + "\t |");
				this.data[j-1][i-1] = result.getObject(i).toString();
			   }
             System.out.println("\n---------------TEST[ "+j+", "+i+" ]------------------");  
			 this.data[j-1][i-1]  = "Supprimer la ligne";
			 j++;
			 }  */

			//on ferme le tout   
               result.close();
               state.close();

		} catch (Exception e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, e.getMessage(), "ERREUR Console ! ", JOptionPane.ERROR_MESSAGE);
		}
	}

	/**
	 * @return the data
	 */
	public Object[][] getData() {
		return data;
	}

	/**
	 * @return the title
	 */
	public String[] getTitle() {
		return title;
	}
	
}


class DeleteButtonEditor
Code : Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package com.sdz.vu;

import com.sdz.vu.Fenetre.ZModel;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JTable;


public class DeleteButtonEditor extends DefaultCellEditor {

	protected JButton button;
	private DeleteButtonListener bListener = new DeleteButtonListener();

	/**
	 * Constructeur avec une checkBox
	 * @param checkBox
	 * @param count
	 */
	public DeleteButtonEditor(JCheckBox checkBox) {
		//Par défaut, ce type d'objet travaille avec un JCheckBox
		super(checkBox);
	    //On crée à nouveau notre bouton
		button = new JButton();
	    button.setOpaque(true);
	    //On lui attribue un listener
	    button.addActionListener(bListener);
	}

	public Component getTableCellEditorComponent(JTable table, Object value,
	                   boolean isSelected, int row, int column) {
		//On définit le numéro de lignes à notre listener
		bListener.setRow(row);
		//On passe aussi le tableau pour des actions potentielles
		bListener.setTable(table);
		//On réaffecte le libellé au bouton
		button.setText( (value ==null) ? "" : value.toString() );
		//On renvoie le bouton
	    return button;
	}

	/**
	 * Notre listener pour le bouton
	 * @author CHerby
	 *
	 */
	class DeleteButtonListener implements ActionListener{

		  private int row;
		  private JTable table;

		  public void setRow(int row){this.row = row;}
		  public void setTable(JTable table){this.table = table;}

		  public void actionPerformed(ActionEvent event) {
			if(table.getRowCount() > 0){
				//On affiche un Zoli message mais vous pourriez faire les traitements que vous voulez
				System.out.println("coucou du bouton : " + ((JButton)event.getSource()).getText() );
				//On affecte un nouveau libellé à une celulle de la ligne
				((ZModel)table.getModel()).removeRow(this.row);

			}
		  }
	  }
	}



Moi aussi je t’aime cysboy

Les 40e rugissants et les 50e hurlants. o_O --> Brainstorming --> CamelCase
Image utilisateur

-------------
"je crois qu'on ne peut mieux vivre qu'en chercant à devenir meilleur, ni plus agréablement qu'en ayant pleine conscience de son amélioration"
Socrate >_<
-------------
les meilleurs peintres se sont fait dire qu’ils n’étaient pas bon, aujourd’hui ce sont des Dieux!
-------------
RTFM :-° l'expression anglaise d'argot Internet Read the fucking manual (« Lis le foutu manuel ») ;
-------------
Mon CV en ligne ici
 
Hors ligne riadf2008 # Posté le 06/10/2009 à 15:12:35

Études : USTHB

Salut, je vois que tu as ajouté pas mal d'amélioration au tp originale :D ! je trouve ton travail très intéressant.
j'ai pas lu les détails de ton code, mais je m'aperçois que j'ai utilisé une toute autre approche (conception, classes utilisées,...) :-°
je précise que mon travail s'est limité au cahier des charges du TP à part le fait que j'ai ajouté la possibilité de préciser une BD spécifique ^^
Je vous propose mon code et attend vos commentaire :p

Nb: @bilred: moi aussi je suis étudiant à l'USTHB, ça fait plaisir de voir nos étudiants actif :)

Secret (cliquez pour afficher)


ihm_classe



Code : Java
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.table.DefaultTableModel;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;
import java.sql.SQLException;


public class ihm_class extends JFrame {
	
	//attributs de la classe:
	JPanel pan=new JPanel();//C:/Users/abdmeziem/Downloads/riad.jpg
	JPanel souspan=new JPanel();
	JButton b1=new JButton(new ImageIcon("C:/Users/abdmeziem/workspace/TP2_java/src/riad.jpg"));
	JButton b2=new JButton("New connexion!") ;
	JToolBar tb=new JToolBar();
	TextArea ta=new TextArea("Saisissez votre requête SQL!",10,20);
	JLabel label=new JLabel("En attente d'une connexion!! ");
	public static Connection connx;
	public  JTable jt;
    traitement_class trait;
   public static int nbdeclick =1;//pour l'instanciation du jtable
	public static boolean verif=false;
    String nomBd=new String();
    //Constructor
    
ihm_class(){
this.setTitle("TP_JAVA(2)");
this.setSize(500, 500);
this.setLocationRelativeTo(null);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// barre d'outil
Dimension size=new Dimension(10,1);


tb.add(b1);
tb.addSeparator(size);
tb.setBorderPainted(true);
tb.add(b2);



ta.setEditable(false);
ta.setBackground(Color.LIGHT_GRAY);


//configuration de pan et souspan

souspan.setLayout(new BorderLayout());
souspan.add(tb,BorderLayout.NORTH);
souspan.add(ta,BorderLayout.CENTER);


pan.setLayout(new BorderLayout());
pan.add(label,BorderLayout.SOUTH);
pan.add(souspan,BorderLayout.NORTH);


b1.setEnabled(false);


//affectation du conteneur principale
this.setContentPane(pan);
//definition de l'ecouteur

b1.addActionListener(new ActionListener(){
	public void actionPerformed(ActionEvent e)
	{
		nbdeclick++;
	trait=new traitement_class(ta.getText());
    //instanciation d'un objet traitement avec le resulat du textarea
	

	}
	
});

b2.addActionListener(new ActionListener(){
	
	

	public void actionPerformed(ActionEvent e) {
	
	 nomBd=JOptionPane.showInputDialog(null,"veuillez entrer le nom de la base de donnée!","connexion à Oracle",JOptionPane.QUESTION_MESSAGE);
	
	
		connection_class tt=new connection_class(nomBd);
	     connx=tt.getConnection1();
	  if (connx!=null)
	  {
	JOptionPane.showMessageDialog(null,"Connexion réussi!! ","Connexion à Oracle",JOptionPane.INFORMATION_MESSAGE);
	label.setText("connexion ok!");
	ta.setEditable(true);
	b1.setEnabled(true);
	  }  
	
	  else
	  {
		  ta.setEditable(false);
			b1.setEnabled(false);
	     
	   JOptionPane.showMessageDialog(null,"Problème lors de la connexion ","Connexion à Oracle",JOptionPane.ERROR_MESSAGE);
	
	                      
	
	         }
	
	               }
	
	
	
	
            });

        }

}

traitement_class


Code : Java
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import java.awt.*;
import java.sql.*;

import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableModel;
import java.util.*
;
public class traitement_class {
	//attributs
	String req;
	
	
	
	//constructeur
	traitement_class(String ch)
	{req=ch;
	//appel de la methode
	traitement();
	}
	//methodes
	void traitement()
	{
		  try  {
			 Statement stat =ihm_class.connx.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
		
		long startTime=System.currentTimeMillis();
		
		ResultSet result=stat.executeQuery(this.req);
		
		long endTime=System.currentTimeMillis();
		
		ResultSetMetaData resultMeta=result.getMetaData();
		
		//traitement concernant l'ihm c à dire Jtable:
		
		/*décalaration du tableau qui servira aux noms des colonnes*/
		int nbredecolonne=resultMeta.getColumnCount();
		String []tab=new String[nbredecolonne];
		
		/*déclaration de la matrice*/
		result.last();//on met le curseur f la dernière ligne
		int nbretuples=result.getRow();//on récupère son num
		result.beforeFirst();//on remet le curseur au debut
		Object mat[][]=new Object [nbretuples][nbredecolonne];
		
		/*remplissage du tableau*/
		
		for(int i=1;i<=nbredecolonne;i++)
		tab[i-1]=resultMeta.getColumnName(i);
		
		/*remplissage de la matrice*/
		int j=0;
		while(result.next())
		{for(int i=1;i<=nbredecolonne;i++)
		mat[j][i-1]=result.getObject(i);
		j++;
		}
		result.close();
		stat.close();
		
		/*intégration des données ds l'ihm*/
		
		
		
	 if ( ihm_class.nbdeclick==2|| ihm_class.verif==false)
		 
	       {
		 
	 
		 main.essai.jt=new JTable(new DefaultTableModel(mat,tab));
		ihm_class.verif=true;/* le JTable pardon! la JTable enfin je  sais pas ! a ete insatncié(e)
		 donc pas la pein de le refaire*/
	 main.essai.pan.add(new JScrollPane(main.essai.jt),BorderLayout.CENTER);
	 
	 main.essai.setContentPane(main.essai.pan);
	 main.essai.jt.setBackground(Color.ORANGE);
	        }
	  else 
	           {//on définit un new model
		 
		 DefaultTableModel monModel=new DefaultTableModel(mat,tab);
		 
		 
		main.essai.jt.setModel(monModel);
		
		
		 
		 
		 
	
	 
	            }
	 String ch=new String();
	 main.essai.label.setText("le temps d'execution en ms:"+" "+"'"+ch.valueOf(endTime-startTime)
			+"'" +" "+"et le nombre de ligne est: "+"'" +nbretuples+"'");
	  
	       }
		
		catch(Exception e){
			// traitement en cas d'erreur
			
			
			
			JOptionPane.showMessageDialog(null, "Vérifez votre requête!","Erreur",JOptionPane.ERROR_MESSAGE);
			
			
			
                         }
		
	   }
	
	
}

connection_class



Code : Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import java.sql.*;
import java.util.*;


public class connection_class 
{
	
private static	String url="jdbc:oracle:thin:hr/oracle@localhost:1521:";

public static Connection conn;
public String ch=new String();

//constructeur
public connection_class(String ch){
	this.ch=ch;
	conn=null;
	;//concaténation de l'url avec le nom de notre BD
	                               }






// methode qui etablie la connection !!!
public    Connection getConnection1(){
 	
			try {
			 
			 Class.forName ("oracle.jdbc.driver.OracleDriver");
			 
			conn=DriverManager.getConnection(url+this.ch.toLowerCase());               
			
	        
		         }
	
	catch(Exception e){
	        e.printStackTrace();
	      
	                    }
			return conn;
                                 
	       
		
		                      }
	  
     
        }


main


Code : Java
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
public class main {

	/**
	 * @param args
	 */
	static ihm_class essai;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
          essai=new ihm_class();
	
	}

}



:p oups j'ai oublié! moi aussi je t'aime cysboy!!

Voir tous les commentaires