Bonjour,

Une petite question a tous les experts de Swing qui sont sur la liste...

Je suis en train d'essayer de faire une table dont la hauteur des lignes
varie en fonction de la longueur du texte qui est contenu dans la cellule.

J'ai donc implemente mon propre TableCellRenderer base sur un JEditorPane,
afin de pouvoir gerer le passage a la ligne dans le cas ou ma cellule n'est
pas assez longue pour contenir le texte. Ca marche si je precise a ma table
que la rowHeight doit etre fixe, mais je voudrais que la rowHeight de la
table varie en fonction du fait que le contenu de la cellule necessite un
passage la ligne ou pas...

Pour le moment, ma classe qui gere l'affichage des cellules de ma table est
a peu pres comme ca:

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.Color;
import java.util.EventObject;
import javax.swing.JTable;
import javax.swing.JEditorPane;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.text.BadLocationException;
import javax.swing.text.View;
import javax.swing.table.TableCellRenderer;


/**
 * 
 * This class is used to render segments of text
 * into a JTable's cells. A JEditorPane is used to
 * display styled text on multi lines
 * 
 */
public class SegmentTableCellRenderer
        extends JEditorPane 
        implements TableCellRenderer
        
{
   
    int preferredWidth = 300;
    
    public SegmentTableCellRenderer() {
        super();

        preferredWidth = 300;
        setDisabledTextColor(Color.black);
        
    }

    public SegmentTableCellRenderer(int preferredWidth) {
        super();
        
        this.preferredWidth = preferredWidth;
        setDisabledTextColor(Color.black);
        
    }

    /**
     *   Method from TableCellRenderer
     */
    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus, int row,
            int column)
    {

        if (isSelected) {
            setBackground(getSelectionColor());
            setForeground(getSelectedTextColor());
        } else {
            setBackground(Color.white);
            setForeground(Color.black);
        }
        
        setFont(table.getFont());
        
        if (hasFocus) {
            setBorder( UIManager.getBorder("Table.focusCellHighlightBorder")
);      
            if (table.isCellEditable(row, column)) {
                setForeground(
UIManager.getColor("Table.focusCellForeground") );
                setBackground(
UIManager.getColor("Table.focusCellBackground") );
            }    
        }
        else {
            setBorder(new EmptyBorder(1, 2, 1, 2));
        }

        setText(value.toString());
        
        return this;
    }

}


Ensuite dans mon program qui gere la table, je fais ca:

JTable maTable = new JTable();
maTable.setModel(unModele);

maTable.getColumnModel().getColumn(0).setCellRenderer(new
SegmentTableCellRenderer(300));
maTable.setRowHeight(80);

Alors si j'ai quelque chose de trop long, ca passe a la ligne, mais si c'est
vraiment trop long, alors le texte est tronque a la fin,
et si le texte n'a pas besoin d'une rowHeight de 80 pour s'afficher alors
j'ai trop d'espace vide.

J'ai essaye de faire des calculs savants dans la methode
getTableCellRendererComponent pour fixer la rowHeight d'une ligne specifique
en fonction de la longueur du texte et de la longueur de la colonne, mais ca
ne marche pas vraiment: dans ce cas, j'ai une table avec une seule ligne,
meme si mon modele contient plein de lignes, et le rafraichissement est tres
lent. D'autre part la hauteur de la ligne dans ce cas est d'une seule ligne
de texte quoi qu'il arrive.

Est ce que vous avez deja rencontre ce probleme? Si oui comment avez vous
fait pour le resoudre? Je suis certain que c'est possible mais je ne connais
pas suffisamment l'API des JTables pour trouver la solution et la Javadoc et
les tutoriels de Sun sont assez limites sur ce cas...

Merci
Nicolas

Répondre à