Я уже читал/пробовал эти сообщения, но это не помогло:
- Отображение нескольких строк в ячейке 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;
}
}
}