bonjour à tous,

j'ai créé un programme serveur (classe ServeurSocket) qui permet la connexion de programmes clients (classe Socket).

Au lancement du serveur, ce dernier récupère dans quatre JTables, les listes des connectés potentiels contenues dans une BDD SQlite.

L'ensemble fonctionne correctement. Afin de suivre les connexions et déconnexions sur mon serveur, j'ai créé un renderer peronnalisé.

Au chargement des JTables, j'associe à chacune d'entre-elles, mon renderer personnalisé :

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
// 2 préparer les JTable
 
					// titres de colonnes
					String [] titres = { "Id sqlite", "Nom", "Prénom", "mdp", "classe", "statut"};
 
					// Remplir les 4 JTables
					jTableSeconde = new JTable(Bdd.chargerDeuxDimensions("seconde"), titres);
					jTablePremière = new JTable(Bdd.chargerDeuxDimensions("premiere"), titres);
					jTableTerminale = new JTable(Bdd.chargerDeuxDimensions("terminale"), titres);
					jTableAdmin= new JTable(Bdd.chargerDeuxDimensions("admin"), titres);
 
					// Ajouter le rendu personnalisé au 4 JTables
					RenduDeJTable monRendu = new RenduDeJTable();
					jTableSeconde.setDefaultRenderer( Object.class, monRendu);
					jTablePremière.setDefaultRenderer( Object.class, monRendu);
					jTableTerminale.setDefaultRenderer( Object.class, monRendu);
					jTableAdmin.setDefaultRenderer( Object.class, monRendu);
 
					//  ajouter les jtable à l'affichage dans les onglets
					InterfaceServeur.ongletSeconde.add(new JScrollPane (jTableSeconde), BorderLayout.CENTER);
					InterfaceServeur.ongletPremière.add(new JScrollPane (jTablePremière), BorderLayout.CENTER);
					InterfaceServeur.ongletTerminale.add(new JScrollPane (jTableTerminale), BorderLayout.CENTER);
					InterfaceServeur.ongletAdmin.add(new JScrollPane (jTableAdmin), BorderLayout.CENTER);
		}	
		//  ========================================  fin de la méthode chargerLesDonnées() ==========================================

Le code du renderer personnalisé permet :

- une mise en forme générale de tous les labels de toutes les tables ( fond opaque et centrage du texte).
- une mise en couleur des headers, qui dépend de la table traitée.
- une mise en fond vert des connectés effectifs (liste disponibles dans "Serveur.List")

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
public class RenduDeJTable extends JLabel implements TableCellRenderer {
 
 
	    public RenduDeJTable()
	    {
	    	// Le backGround d'un JLabel par défaut est transparent 
	        super.setOpaque(true);
	        super.setHorizontalAlignment(SwingConstants.CENTER);
	    }
 
	    @Override
	    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
	        boolean hasFocus, int row, int column)
			    {   
 
			    	// traitement commun à toutes les cases, pour chaque case "label" 
							table.setRowHeight(30);
							super.setText(value.toString()); 
							super.setFont(new Font ("Arial", Font.PLAIN, 16));
 
					    	System.out.println(" la ligne vaut : " + row + "   et la colonee vaut : " + column);
 
 
					    	// un seul passage par ligne, pour la colonne 1 uniquement
					    	boolean connecté = false;
					    	   	if (column == 1  ) {
 
					    	   		System.out.println((String)table.getValueAt(row, column));
 
						    		for (Identité p : Serveur.list) {
												if (p.getNom().equals((String)table.getValueAt(row, column))) {
														System.out.println("**************************ligne trouvée : " + p.getNom() + "*******************");
						    							connecté = true;
						    							break;
												};
					    				}
				    			}
 
						    	if (connecté) {
						    		super.setBackground(Color.green);
						    	}
						    	else {
								super.setBackground((row % 2 == 0) ? Color.white : Color.LIGHT_GRAY);
						    	}
 
					// traitement spécifique pour chaque table
 
					    	// mise en forme spécifiques seconde
							if (table == Serveur.jTableSeconde) {
									table.getTableHeader().setBackground(Color.red);
 
							}
							// mise en forme spécifiques première
							else if (table == Serveur.jTablePremière) {
									table.getTableHeader().setBackground(Color.orange);
							}
							// mise en forme spécifiques terminale
							else if (table == Serveur.jTableTerminale) {
									table.getTableHeader().setBackground(Color.green);
							}
							// mise en forme spécifiques admin
							else if (table == Serveur.jTableAdmin) {
									table.getTableHeader().setBackground(Color.yellow);
 
							}
 
					return this;     
			    }
 
 
}

L'ensemble fonctionne mais j'ai du mal, malgré les infos ou tutos, à avoir une démarche claire.

1/ Ma manière de procéder est-elle correcte ou puis-je améliorer cette manière de faire? (Quel tuto si vous connaissez?)

2/ Quand je travaille avec les Jcomponent, un fois déssinés, il ne sont pas repeints en permanence, à part si la fenêtre change de dimensions ou si je décide de faire un "repaint()".
Ici, mon renderer semble parcourir les tables sans arrêt, même après le chargement, la mise à jour ne semble jamais s'interrompre et le parcours de toutes mes cellules semble permanent.
Il parait plus logique de tout parcourir au chargement, puis si un changement ou une démarche volontaire du programmeur est détecté, on refait un passage puis stop jusqu'à la prochaine demande de parcours.
Ce parcours permanent est-il du à une mauvaise programmation ou est-ce son comportement normal, quitte à travailler en permanence pour pas grand chose??

Merci à tous...