JList 项中的自动换行
Posted
技术标签:
【中文标题】JList 项中的自动换行【英文标题】:Word wrap in JList items 【发布时间】:2012-01-02 02:06:00 【问题描述】:我有一个 JList
的项目名称很长,导致水平滚动条出现在滚动窗格中。
无论如何我可以自动换行,以便整个项目名称出现在 2 行中,但可以一键选择?即,它仍应表现为单个项目,但显示为两行。
这是我在看到下面的示例后所做的
我在我的项目 MyCellRenderer 中添加了一个新类,然后在我的列表的帖子创建代码中添加了 MyList.setCellRenderer(new MyCellRenderer(80));
。我还有什么需要做的吗?
【问题讨论】:
我似乎记得有人(是 Andrew)使用 JLabel、html 和简单的样式表来解决这样的问题。 是的,当然是 Andrew:is-there-some-word-wrap-property-of-jlabel-exist。我相信这个概念也可以用在你的自定义单元格渲染器中。 另一种选择(为什么每个人都在看我好笑?)是使用工具提示作为长名称,使用“值是...”作为标签本身。当然,这不适用于HFoEs answer中给出的一个具体示例。我不想将鼠标悬停在列表上以区分每个名为“Mohamed”的人。 【参考方案1】:是的,使用 Andrew 的代码,我想出了这样的东西:
import java.awt.Component;
import javax.swing.*;
public class JListLimitWidth
public static void main(String[] args)
String[] names = "John Smith", "engelbert humperdinck",
"john jacob jingleheimer schmidt" ;
MyCellRenderer cellRenderer = new MyCellRenderer(80);
JList list = new JList(names);
list.setCellRenderer(cellRenderer);
JScrollPane sPane = new JScrollPane(list);
JPanel panel = new JPanel();
panel.add(sPane);
JOptionPane.showMessageDialog(null, panel);
class MyCellRenderer extends DefaultListCellRenderer
public static final String HTML_1 = "<html><body style='width: ";
public static final String HTML_2 = "px'>";
public static final String HTML_3 = "</html>";
private int width;
public MyCellRenderer(int width)
this.width = width;
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus)
String text = HTML_1 + String.valueOf(width) + HTML_2 + value.toString()
+ HTML_3;
return super.getListCellRendererComponent(list, text, index, isSelected,
cellHasFocus);
【讨论】:
这不是我的聪明才智,而是这里的这个:Andrew's post。我不能多次为他的回答点赞,但我鼓励任何认为我的回答对链接有帮助的人点赞。 (你们都知道,包括@Andrew Thompson,我不太喜欢 html 欺骗,尤其是如果误用于硬编码大小它可以更容易地完成。您可以使用 ListModel 通过构造函数创建 JList。在 CustomListModel 扩展 AbstractListModel 中,getElementAt() 方法可以返回具有相同 html 格式文本的字符串。所以这种方式在不修改单元格渲染器的情况下也是如此。
【讨论】:
包装是 UI 而不是模型相关。更改模型以适应 UI 是不好的。【参考方案3】:您还可以动态计算宽度(而不是固定值):
String text = HTML_1 + String.valueOf(**list.getWidth()**) + HTML_2 + value.toString() + HTML_3;
因此,如果面板调整列表大小,换行仍然正确。
更新
结果如下所示:
【讨论】:
这不起作用。如果调整 JList 的大小,则不会调整行的高度,并且会发生有趣的视觉事情。看我附上的图片...我添加了绿色和红色来帮助说明。以上是关于JList 项中的自动换行的主要内容,如果未能解决你的问题,请参考以下文章