Есть ли способ сделать каждый элемент списка JList разной ширины? - PullRequest
1 голос
/ 20 июня 2019

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

До сих пор мне удалось загрузить отдельные элементы всписок, ограничить количество строк и сделать их обтекание по горизонтали.Теперь я написал собственный ListCellRenderer, полагая, что это может решить мою проблему, но это не работает так, как я надеялся.Две строки, являющиеся частью каждого элемента, не центрированы и не отображаются друг над другом (фактически, они вообще не читаются, потому что кажутся нарисованными вне ячейки), и все они имеют одинаковый размер.Что я делаю не так?

Вот так выглядит мой рендерер:

public class ElementRenderer extends JPanel implements ListCellRenderer<Element> {
    private Element element;

    @Override
    public Component getListCellRendererComponent(JList<? extends Element> list, Element value, int index,
            boolean isSelected, boolean cellHasFocus) {
        element = (Element) value;
        if (element.getTag().equals("N/A"))
            setEnabled(false);
        else
            setEnabled(true);
        if (isSelected)
            setBorder(BorderFactory.createLoweredSoftBevelBorder());
        else
            setBorder(BorderFactory.createRaisedSoftBevelBorder());
        return this;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (!isEnabled())
            setBackground(Color.GRAY);

        String word = element.getWord();
        String tag = element.getTag();

        FontMetrics fm = getFontMetrics(DataManager.getCurrentFont());
        Rectangle bounds = getVisibleRect();

        int y = bounds.y + ((bounds.height - 2*fm.getHeight())/2) + fm.getAscent();
        g.drawString(word, bounds.x + (bounds.width - fm.stringWidth(word))/2, y);
        g.drawString(tag, bounds.x + (bounds.width - fm.stringWidth(tag))/2, y + fm.getHeight());
    }

    @Override
    public Dimension getPreferredSize() {
        FontMetrics fm = getFontMetrics(DataManager.getCurrentFont());
        int wordwidth = fm.stringWidth(element.getWord());
        int tagwidth = fm.stringWidth(element.getTag());
        if (tagwidth > wordwidth)
            wordwidth = tagwidth;
        return new Dimension(17+wordwidth, 3+fm.getHeight()*2);
    }
...