Я уже читал/пробовал эти сообщения, но это не помогло:
- Отобразить несколько строк в ячейке Jlist
- Как получить многострочный текст для Jlist?
- Проблема с отображением компонентов JList
Мне нужен ListCellRenderer
, который возвращает панель с иконкой слева и текстом динамической длины справа (например, на любом форуме: слева - аватар пользователя, справа - текст сообщения), Тексты НЕ известны мне, поэтому я не могу установить фиксированную высоту ячейки. Кроме того, длина текста отличается от ячейки списка до ячейки списка. Поэтому каждая ячейка списка нуждается в собственной высоте в зависимости от длины текста. На самом деле действительно общий макет... но не для Swing. Высота ячейки просто не расширяется в соответствии с длиной текста.
Я уже прочитал почти любую публикацию о динамических высотах ячеек и многострочных текстах в JList
, но не смог найти решение. Поэтому я решил дать небольшой SSCCE. Пожалуйста, дайте мне подсказку о том, как достичь того, что я описал, или, пожалуйста, исправить мой код, если вы считаете это легким.
Спасибо
Здесь находится 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;
}
}
}