Swing JList avec texte multiligne et hauteur dynamique
J'ai déjà lu/essayé ces postes, mais cela n'a pas aidé:
- Affichage de plusieurs lignes dans une cellule Jlist
- Comment obtenir multiligne pour une Jlist texte?
- Problème d'affichage des composants de la JList
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 JList
mais 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
Vous devez vous connecter pour publier un commentaire.
Edit 1: oops - voir @Andrew capture d'écran, rendu compte que cela ne fonctionne pas comme prévu, le texte est plus long que ce qui est illustré dans cette (oublié un commentaire interne "en ATTENTE: pas de travail pour JList dans JScrollPane" 😉 Sera de creuser un peu et de supprimer cette réponse si je ne peux pas le faire bientôt.
Edit 2: eu - le moteur de rendu de mise en œuvre, comme illustré ci-dessous est correct, le coupable est la JList avec ses occasionnels de moins que la taille optimale de mise en cache. Il y a deux parties de cette
Code qui utilise le moteur de rendu ci-dessous:
Première réponse (un convertisseur de mise en œuvre qui utilise JTextArea que le rendu du composant)
TextArea est un peu délicat dans le dimensionnement: il a besoin d'obtenir initialisé à quelque chose de raisonnable: