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...
Partager