Bonsoir à tous,

Je suis en train de m'arracher les cheveux sur un problème de positionnement et de redimensionnement de composants.
En gros, la partie de mon appli concernée fait en sorte d'afficher, pour un utilisateur donné, la liste de ses comptes classés par banque.
Je veux présenter cela en mettant une étiquette donnant le nom de la banque avec en dessous la table récupérant les comptes de cette banque.
Je veux que chacun de ces blocs prenne toute la largeur disponible et soit placé au-dessous du précédent, avec un séparateur entre chaque bloc.
Je veux que l'ensemble de ces blocs soit placé en haut du conteneur. Si le conteneur est trop grand, je veux que l'espace libre soit sous le dernier bloc (normal puisque je veux que le premier soit en haut de la page). Si le conteneur est trop petit, un JScrollPane contenant l'ensemble des blocs et contenu dans le conteneur principal permettra de visualiser l'ensemble des données.

Pour cela, j'ai fait ce code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
 
package pack;
 
//================================================//
//== IMPORTATION DES CLASSES EXTERNES UTILISEES ==//
//================================================//
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.text.ParseException;
 
import javax.swing.Box;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableModel;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
 
 
 
//========================//
//== CORPS DE LA CLASSE ==//
//========================//
 
public class ListeTest extends JPanel
{
	//*****************************//
	//* DECLARATION DES VARIABLES *//
	//*****************************//
 
	JPanel principal = new JPanel();
 
	//****************//
	//* CONSTRUCTEUR *//
	//****************//
 
	public ListeTest() throws ParseException
	{
		super();
		principal.setLayout(new BorderLayout());
 
		InitListeComptes();
 
		principal.revalidate();
		this.setLayout(new BorderLayout());
		this.add(principal, BorderLayout.CENTER);
		this.revalidate();
	}
 
 
 
 
 
	//========================//
	//== METHODES DE CLASSE ==//
	//========================//	
 
 
	private void CreationTable(String requete, String[] titresColonnes, JTable table, String messageSiRequeteVide, JPanel panel, GridBagConstraints contrainte) throws SQLException
	{
		/* Exécution de la requête requete */
		Statement state = Connexion.ouvrirConnexion().createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
		ResultSet rs = state.executeQuery(requete);
		rs.last();
 
		/* Si des enregistrements sont retournés par la requête */
		if (rs.getRow() != 0)
		{
			/* Récupération des métadonnées du résultat de la requête */
			ResultSetMetaData rsMeta = rs.getMetaData();
			/* Déclaration d'un tableau recueillant les résultats de la requête */
			Object[][] donnees = new Object[rs.getRow()][rsMeta.getColumnCount()];
 
			/* Remplissage du tableau */
			rs.beforeFirst();
			int j = 1;
			while (rs.next())
			{
				for (int i = 1 ; i <= rsMeta.getColumnCount(); i++)
					donnees[j-1][i-1] = rs.getObject(i);
				j++;
			}
 
			/* Fermeture des objets utilisés pour l'exécution de la requête et la récupération des résultats */
			rs.close();
			state.close();
 
			/* Création d'un nouveau modèle de table avec redéfinition de la méthode isCellEditable(row, column)
			 * afin de rendre toutes les cellules de la table affichant les résultats de la requête non éditables */
			String[] colonnes = titresColonnes;
			DefaultTableModel tableNonEditable = new DefaultTableModel(donnees, colonnes)
												 {
												 	 public boolean isCellEditable(int row, int column)
												 	 {
												 		 return false;
												 	 }
												 };
 
			/* Création de la table en utilisant le modèle précédemment défini */
			table.setModel(tableNonEditable);
 
			/* Modification du mode de sélection de la table afin que l'utilisateur ne puisse sélectionner qu'une seule ligne à la fois */
			table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
 
			Box pan = Box.createVerticalBox();
			pan.add(table.getTableHeader());
			pan.add(table);
 
			/* Ajout de ce conteneur au conteneur passé en paramètre panel */
			panel.add(pan, contrainte);
		}
 
		/* Rafraîchissement du conteneur principal */
		panel.revalidate();
	}
 
 
 
	//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//
	// Construction de la table servant à l'affichage des comptes //
	//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//
 
	public void InitTable(int numeroBanque, JTable tableC, JPanel pane, GridBagConstraints constraint)
	{
		/* Requête donnant les comptes de la banque dont l'id est numeroBanque */
		String req = new String("SELECT num_compte, " +
							   "libelle_compte, " +
                                                           date_creation_compte, " + 
                                                           (COALESCE((SELECT SUM(montant) AS total_credit " + 
                                                                           "FROM operation O, type_operation T_O " + 
                                                                          "WHERE O.id_type_op = T_O.id_type_op " + 
                                                                              "AND T_O.sens_op = 'Crédit' " + 
                                                                              "AND O.num_compte = C.num_compte), 0) - COALESCE((SELECT SUM(montant) AS total_debit " + 
                                                                    "FROM operation O2, type_operation T_O2 " + 
                                                                   "WHERE O2.id_type_op = T_O2.id_type_op " + 
                                                                       "AND T_O2.sens_op = 'Débit' " + 
                                                                       "AND O2.num_compte = C.num_compte), 0)) AS solde " + 
                                              "FROM compte C " + 
                                             "WHERE C.id_user = " + Main.getNumeroUtilisateur() + " " + 
                                                 "AND C.id_banque = " + numeroBanque + " " + 
                                             "ORDER BY num_compte");
 
		/* Création du header de la table tableC */
		String[] titresTable = {"NUMERO", "LIBELLE", "DATE DE CREATION", "SOLDE"};
 
		/* Chaîne à afficher si aucun enregistrement n'est retourné */
		String chaineSiReqVide = new String("Aucun compte enregistré.");
 
		/* Création de la table avec les paramètres définis ci-dessus */
		try
		{
			CreationTable(req, titresTable, tableC, chaineSiReqVide, pane, constraint);
		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		pane.revalidate();
		principal.revalidate();
	}
 
 
 
	public void InitListeComptes()
	{
		/* Requête listant les banques de l'utilisateur */
		String reqBanques = new String("SELECT DISTINCT nom_banque, B.id_banque " +
									   "FROM banque B, compte C " +
									   "WHERE B.id_banque = C.id_banque " +
									     "AND C.id_user = " + Main.getNumeroUtilisateur() + " " +
									   "ORDER BY nom_banque");
		try
		{
			/* Exécution de la requête */
			Statement st = Connexion.ouvrirConnexion().createStatement();
			ResultSet result = st.executeQuery(reqBanques);
			result.last();
 
			/* Récupération du nombre de banques renvoyées */
			int nbBanques = result.getRow();
 
			/* Création du conteneur devant être inséré dans le conteneur principal, et qui va contenir 
			 * les étiquettes et les tables des comptes correspondant à chaque banque */
			JPanel panelBanques = new JPanel(new GridBagLayout());
			panelBanques.setBackground(Color.blue);
 
			/* Définition des premières contraintes */
			GridBagConstraints gbc = new GridBagConstraints();
			gbc.gridx = 0;
			gbc.weighty = 0;
			gbc.weightx = 0;
			gbc.fill = GridBagConstraints.HORIZONTAL;
			gbc.insets = new Insets(5, 0, 5, 0);
 
			/* Si l'utilisateur a enregistré des banques ... */
			if (nbBanques != 0)
			{
				result.beforeFirst();
 
				/* Variable utilisée pour définir la contrainte gridy */
				int cellY = 0;
 
				/* Compteur permettant de savoir si un séparateur doit être ajouté après un bloc étiquette/table d'une banque */
				int m = 1;
 
				/* Parcours du résultat de la requête */
				while (result.next())
				{
					/* Définition de contraintes supplémentaires */
					gbc.gridy = cellY;
					gbc.anchor = GridBagConstraints.PAGE_START;
 
					/* Ajout de l'étiquette contenant le nom de la banque examinée */
					panelBanques.add(new JLabel(result.getString(1)), gbc);
 
					/* Redéfinition de la contrainte gridy */
					cellY++;
					gbc.gridy = cellY;
 
					/* Création de la table destinée à contenir les comptes de la banque examinée */
					JTable tableComptes = new JTable();
					InitTable(Integer.parseInt(result.getString(2)), tableComptes, panelBanques, gbc);
 
					/* Incrémentation de cellY en vue de la prochaine boucle */
					cellY++;
 
					/* Si la banque examinée n'est pas la dernière, insertion d'un séparateur à panelBanques */
					if (m < nbBanques)
					{
						gbc.gridy = cellY;
						panelBanques.add(new JSeparator(SwingConstants.HORIZONTAL), gbc);
						cellY++;
					}
 
					/* Incrémentation de m en vue de la prochaine boucle */
					m++;
				}
 
				/* Insertion de panelBanques dans un JScrollPane */
				JScrollPane scrollBanques = new JScrollPane(panelBanques);
 
				/* Ajout de scrollBanques dans le conteneur principal */
				principal.add(scrollBanques, BorderLayout.CENTER);
				principal.revalidate();
			}
			else
			{
				System.out.println("Aucune banque");
			}
			result.close();
			st.close();
		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}
	}
}
Mais je ne comprends pas pourquoi j'obtiens cela :

Nom : Résultat.jpg
Affichages : 53
Taille : 36,5 Ko

Auriez-vous une idée parce que moi je ne sais plus quoi faire là ...
Merci d'avance à ceux qui auront pris la peine de me lire.

P.S.: il faut savoir qu'en fait, ce que je présente ici n'est qu'une partie de la classe ListeTest. En fait, je l'utilise pour lister aussi d'autres choses comme les opérations d'un compte, les utilisateurs ... Ceci est donc une version épurée utilisée uniquement pour les comptes. Le conteneur appelé principal doit obligatoirement être en BorderLayout car j'y ajoute un autre petit panel au sud, et pour les opérations, un panel au nord.