eh eh
Alors, j’ai bidouillé à mort mon renderer. Et je me suis aperçu que le rafraîssement ne permet pas de redimensionner la cellule de la liste. Il y a cependant une méthode que je n’ai pas tester, supprimer puis rajouter à la même position la cellule dont la taille est à modifier (mais ca, ca serait plus dans le cas où je souhaite rajouter un élément, chose que je ne prévois pas de faire).
Donc, comme le rafraîssement ne permet pas de redimenssionner la cellule (pour pouvoir faire afficher tout mon JTextArea, rappelons le ^^), et bien j’ai calculé la taille au moment de la construction de la liste, avant le premier affichage. Normalement, tous les yeux s’ouvrent en grand : Comment ?
J’ai définit un constructeur dans mon renderer, qui initialise tous ce qui est affichage et emboitage d’éléments. Comme ma fenêtre est de taille fixe (et que je connais sa taille), et bien j’ai défini une taille fixe initialise pour mon JTextArea avant qu’il soit afficher. Au moment où la liste appelle la fameuse méthode getComponentBlabla…, et bien je calcule la hauteur du JTextArea en fonction du texte dedans, et je lui fixe sa hauteur (pour un JTextArea, la fonction setRows). Et ca passe !!!
La preuve en image :
http://img167.imageshack.us/img167/8631/extentions38xi.th.png
Le bout de code :
public class PluginManagerListCellRenderer extends JPanel
implements ListCellRenderer {
private JLabel name;
private JLabel category;
private JTextArea description;
private JButton boutonExecuter;
private JPanel container;
public PluginManagerListCellRenderer( JList list ) {
super( new BorderLayout() );
setBorder( BorderFactory.createCompoundBorder(
BorderFactory.createMatteBorder( 0, 0, 1, 0, Color.lightGray ),
BorderFactory.createEmptyBorder( 3, 3, 3, 3 ) ) );
setOpaque( false );
Font styleSimple = (new JLabel( "font" )).getFont();
Font styleGras = new Font( styleSimple.getName(),
Font.BOLD, styleSimple.getSize() );
name = new JLabel();
name.setFont( styleGras );
name.setOpaque( false );
category = new JLabel();
category.setFont( styleSimple );
category.setOpaque( false );
description = new JTextArea();
description.setBorder( BorderFactory.createEmptyBorder( 5, 0, 0, 0 ) );
description.setEditable( false );
description.setFont( (new JLabel()).getFont() );
description.setOpaque( false );
description.setLineWrap( true );
description.setWrapStyleWord( true );
boutonExecuter = new JButton( "Executer" );
JPanel boutonPanel = new JPanel( new FlowLayout( FlowLayout.RIGHT ) );
boutonPanel.add( boutonExecuter );
boutonPanel.setOpaque( false );
JPanel p1 = new JPanel( new BorderLayout() );
p1.add( name, BorderLayout.NORTH );
p1.add( category, BorderLayout.CENTER );
p1.setOpaque( false );
JPanel p2 = new JPanel( new BorderLayout() );
p2.add( p1, BorderLayout.WEST );
p2.add( boutonPanel, BorderLayout.EAST );
p2.setOpaque( false );
container = new JPanel( new BorderLayout() );
container.add( p2, BorderLayout.NORTH );
container.add( description, BorderLayout.SOUTH );
container.setBorder( BorderFactory.createEmptyBorder( 5, 5, 5, 5 ) );
Dimension d = description.getPreferredSize();
d.setSize( 635, d.getHeight() );
description.setPreferredSize( d );
add( container, BorderLayout.CENTER );
}
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus ) {
if( isSelected || list.getSelectedIndex()==index ) {
name.setForeground( list.getSelectionForeground() );
category.setForeground( list.getSelectionForeground() );
description.setForeground( list.getSelectionForeground() );
container.setBackground( list.getSelectionBackground() );
boutonExecuter.setEnabled( true );
boutonExecuter.setUI( (new JButton()).getUI() );
} else {
name.setForeground( (new JLabel()).getForeground() );
category.setForeground( (new JLabel()).getForeground() );
description.setForeground( (new JLabel()).getForeground() );
container.setBackground( list.getBackground() );
boutonExecuter.setEnabled( false );
boutonExecuter.setUI( null );
}
if( value instanceof Plugin ) {
Plugin plugin = (Plugin) value;
name.setText( plugin.getName() );
category.setText( " [ " + plugin.getCategory() + " ]" );
description.setText( plugin.getDescription() );
int largeurTexte = (description.getFontMetrics( description.getFont() )).stringWidth( description.getText() );
int hauteurFont = description.getFontMetrics( description.getFont() ).getHeight();
int largeurContainer = (int) description.getPreferredSize().getWidth();
int hauteurTexte = (int) ( largeurTexte / largeurContainer ) + 1;
description.setRows( hauteurTexte );
//System.out.println( "largeurTexte=" + largeurTexte );
//System.out.println( "hauteurFont=" + hauteurFont );
//System.out.println( "largeurContainer=" + largeurContainer );
//System.out.println( "hauteurTexte=" + hauteurTexte );
//System.out.println();
}
return this;
}
}
Bon alors, certe, ca me suffit. Mais ca n’est quand même pas ce que je voulais au départ. Je rappelle le pb, faire que tout soit automatique, sans avoir à spécifier de taille (donc sans avoir à faire une pseudo initialisation foireuse au départ). Voilà, le problème reste entier ^^ Je suis ouvert à toute proposition !
Le reste, j’ai constaté qu’un bouton dans un renderer de JList ne peut pas être actionner. J’ai penser à simuler l’action du bouton, mais ca fait là aussi un truc vraiment barbare ^^ Faudrait peut-être mieux que je passe par un JPanel tout bête au lieu de la JList (ou une JTable, mais j’ai tenté, et ca passe vraiment moins bien) …