Я пытаюсь отобразить строки в строках и столбцах.Поскольку они различаются по длине и представляют собой части непрерывного текста, я бы хотел, чтобы каждый компонент занимал только тот размер, который необходим для отображения всей строки.
До сих пор мне удалось загрузить отдельные элементы всписок, ограничить количество строк и сделать их обтекание по горизонтали.Теперь я написал собственный 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);
}