Swing Jlist с многослойным текстом и динамической высотой

Я уже прочитал / пробовал эти сообщения, но это не помогло:

, что мне нужно, это listCellRenderer , который возвращает панель со значком слева и текстом динамической длины справа (например, на любом форуме: Слева от аватара пользователя, справа от текста пост). Тексты нет , известных мне, поэтому я не могу установить фиксированную высоту ячейки. Кроме того, длина текста отличается от ячейки списка для списка ячейки. Таким образом, каждый список списков нуждается в собственной высоте в зависимости от длины текста. На самом деле действительно общий макет ... но не для качания. Высота ячейки просто не расширяется в соответствии с длиной текста.

Я уже прочитал практически любые сообщения о динамических высотах клеток и многоуровневых текстах в JLIST , но не смог найти решение. Поэтому я решил дать небольшой SSCCE. Пожалуйста, дайте мне намек на то, как добиться того, что я описал или, пожалуйста, исправьте свой код, если вы думаете, что это легко.

Спасибо

Вот THS 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;

        }
    }

}

14
задан Community 23 May 2017 в 12:17
поделиться