Bonjour,
Nouveau sur ce site, et débutant dans la POO, en particulier Java, je me tourne vers vous afin de vous demandez une petite aide sur un petit problème que je rencontre et qui, je suis sûr, a une solution simple. Tout cela dans le cadre d'une auto-formation. En fait, avant de détailler, mon problème se situe sur une "sorte" d'imbrication de DefaultTableCellRenderer. Mais avant tout, mon code va en faire sans doute hurler plus d'un, mais on a tous été débutant, non ?
En effet, j'ai une classe ProprietesLigneTable qui permet de définir la police, les bordures des cellules et la couleur des lignes. Elle marche bien et je la donne ci-dessous :
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
 
public class ProprietesLigneTable extends DefaultTableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        setFont(new Font("Lucida Console", Font.PLAIN, 13));
        setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
        if ((row & 1) == 0) {                    // Ligne paire
            setBackground(Color.LIGHT_GRAY);
        } else {                                 // Ligne impaire
            setBackground(Color.WHITE);
        }
        return this;
    }
}
Cette classe est mise en oeuvre dans une méthode (d'une autre classe) de la façon suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
TableColumn col;
table.setRowHeight(28);
ProprietesLigneTable pct=new ProprietesLigneTable();
for (int i=0;i<=nbColonnes;i++) {
            table.getColumnModel().getColumn(i).setCellRenderer(pct);
            col = table.getColumnModel().getColumn(i);
            if(table.getModel().getColumnName(i).equals("Compte")) {
            // Là je fais quelques traitements du style :
                col.setMinWidth(87);
                col.setMaxWidth
Tout ça marche bien. En fait, pour résumer cette méthode, elle donne des tailles fixes aux colonnes et ces tailles sont fonction de la longueur de la source. Est-ce dans la philosophie Java, je ne sais pas, mais là n'est pas encore mon problème.
En glanant sur Internet, j'ai trouvé aussi la façon de centrer le contenu dans une colonne, et le code suivant marche bien :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
        DefaultTableCellRenderer custom =  new DefaultTableCellRenderer(); 
        custom.setHorizontalAlignment(JLabel.CENTER); // centre les données de ton tableau
        col.setCellRenderer(custom); // avec col=col = table.getColumnModel().getColumn(i);
Mais si on reprend ma méthode ci-dessus et qu'on fait :
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
 
// Propriétés des lignes.
 
        DefaultTableCellRenderer custom =  new DefaultTableCellRenderer(); 
        custom.setHorizontalAlignment(JLabel.CENTER); // centre les données de ton tableau
 
        TableColumn col;
        table.setRowHeight(28);
        ProprietesLigneTable pct=new ProprietesLigneTable();
        for (int i=0;i<=nbColonnes;i++) {
            table.getColumnModel().getColumn(i).setCellRenderer(pct);
            col = table.getColumnModel().getColumn(i);
            if(table.getModel().getColumnName(i).equals("Compte")) {
                //col.setPreferredWidth(87);
                col.setMinWidth(87);
                col.setMaxWidth(87);
            } else if(table.getModel().getColumnName(i).equals("Date")) {
                //col.setPreferredWidth(87);
                col.setMinWidth(87);
                col.setMaxWidth(87);
                col.setCellRenderer(custom);
la colonne perd toutes les propriétés mises en œuvre par l'instanciation de ProprietesLigneTable(). En fait j'ai soit l'un, soit l'autre, mais pas les deux.
Je ne sais pas si j'ai été très clair. Il me semble que dans ma classe ProprietesLigneTable() j'utilise DefaultTableCellRenderer mais que comme dans ma méthode j'en instancie un autre, le premier n'est plus d'actualité.
Et ma question est donc : comment faire pour appliquer mon setCellRenderer(custom).
Je vous remercie beaucoup,
Aldrik.