jlist不会显示整行或方式太多

时间:2014-01-16 17:34:48

标签: java swing scrollbar jlist

新手在这里。

所以,我试图用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         |
+---------------+

我想要它的原因是即使我不知道每个项目的开始位置,也能够单独选择一行。

有人告诉我放一个水平滚动条,看起来不错。我只是不知道如何去做。

感谢您的投入!

1 个答案:

答案 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);

请参阅https://stackoverflow.com/a/8197454/3178834