Swing JList avec texte multiligne et hauteur dynamique

J'ai déjà lu/essayé ces postes, mais cela n'a pas aidé:

Ce dont j'ai besoin est un ListCellRenderer qui retourne un panneau avec une icône sur la gauche et un texte de longueur dynamique sur la droite (comme dans tout forum: sur la gauche, un avatar de l'utilisateur, sur la droite de l'affichage d'un texte). Les textes sont PAS connu pour moi, donc je ne peux pas fixe la hauteur de la cellule. De plus, la longueur du texte diffère de la liste de cellules de la liste de cellules. Ainsi, chaque liste cellule a besoin de sa propre hauteur en fonction de la longueur du texte. En fait vraiment une mise en commun ... mais pas pour le Swing. La hauteur de la cellule n'a pas l'étendre en fonction de la longueur du texte.

J'ai déjà lu presque tous les post au sujet de la dynamique des cellules de hauteurs et plusieurs lignes de textes en JListmais ne pouvais pas trouver une solution. J'ai donc décidé de donner un petit SSCCE. Merci de me donner un indice sur la façon de réaliser ce que j'ai décrit, ou s'il vous plaît corriger mon code si vous pensez que c'est facile.

Grâce

Voici sat SSCCE:

public class MultiLineList extends JFrame
{
private static final long serialVersionUID = 1L;
public static void main(final String[] args)
{
new MultiLineList();
}
private MultiLineList()
{
setTitle("MultiLineList");
setSize(800, 450);
setResizable(true);
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.getContentPane().setLayout(new BorderLayout());
final DefaultListModel model = new DefaultListModel();
model.addElement("This is a short text");
model.addElement("This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. ");
model.addElement("This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. ");
final JList list = new JList(model);
list.setCellRenderer(new MyCellRenderer());
this.add(list);
this.getContentPane().invalidate();
this.getContentPane().validate();
}
public class MyCellRenderer extends DefaultListCellRenderer
{
@Override
public Component getListCellRendererComponent(final JList list, final Object value, final int index, final boolean isSelected, final boolean hasFocus)
{
final String text = (String) value;
//create panel
final JPanel p = new JPanel();
p.setLayout(new BorderLayout());
//icon
final JPanel IconPanel = new JPanel(new BorderLayout());
final JLabel l = new JLabel("icon"); //<-- this will be an icon instead of a text
IconPanel.add(l, BorderLayout.NORTH);
p.add(IconPanel, BorderLayout.WEST);
//text
final JTextArea ta = new JTextArea();
ta.setText(text);
ta.setLineWrap(true);
ta.setWrapStyleWord(true);
p.add(ta, BorderLayout.CENTER);
return p;
}
}
}

source d'informationauteur haferblues