【发布时间】:2019-06-20 11:10:44
【问题描述】:
我正在尝试在行和列中显示字符串。由于它们的长度不同并且代表连续文本的一部分,我希望每个组件只占用显示整个字符串所需的大小。
到目前为止,我设法将单个项目加载到列表中,限制行数并使它们水平换行。我现在编写了一个自定义 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);
}
【问题讨论】:
标签: java swing jlist paintcomponent renderer