新手在这里。
所以,我试图用Jlist列出一些项目,但是我不能像使用jTextArea那样将它们包装到下一行。当我为列表项放置一个长字符串时,窗口宽度随之扩大。这是不可取的。
然后,我限制了列表的宽度。它有效,但是你不能阅读文本。
jList1.setModel(new javax.swing.AbstractListModel() {
String[] strings = { "Item 1", "Item 2 is a big old thing and it won´t wrap", "Item 3" };
public int getSize() { return strings.length; }
public Object getElementAt(int i) { return strings[i]; }
});
上面的代码返回:
+---------------+
|Item 1 |
|Item 2 is a b..|
|Item 3 |
+---------------+
但我想:
+---------------+
|Item 1 |
|Item 2 is a big|
|old thing and i|
|t won´t wrap |
|Item 3 |
+---------------+
我想要它的原因是即使我不知道每个项目的开始位置,也能够单独选择一行。
有人告诉我放一个水平滚动条,看起来不错。我只是不知道如何去做。
感谢您的投入!
答案 0 :(得分:1)
我认为这可以解决您的问题。所有积分都转到Hovercraft Full Of Eels。我只重新格式化了他的代码并添加了一些解释,这对我来说似乎更有帮助。
您所要做的就是为jList
使用自定义CellRenderer ,如下所示:
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);
}
}
以下是如何使用它的一个小例子(进一步说明)
首先设置您的jList
,就像您通常那样。然后使用特定的线宽创建自定义CellRenderer的实例 - 在本例中为MyCellRenderer
。最后,您只需将渲染器添加到jList。
MyCellRenderer cellRenderer = new MyCellRenderer(80);
list.setCellRenderer(cellRenderer);
如果需要,还可以将jList包装到jScrollPane
中,然后必须将其添加到基础容器而不是列表本身。
JScrollPane sPane = new JScrollPane(list);
JPanel panel = new JPanel();
panel.add(sPane);