JTable et TableCellRenderer
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:
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:
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...