2014-01-16 45 views
1

新手在這裏。所以,我試圖用Jlist列出幾個項目,但是我不能像下一行那樣將它們包裝到下一行,就像我使用jTextArea一樣。當我爲列表項目放置一個長字符串時,窗口寬度會隨之擴大。這是不可取的。jlist不會顯示整行或太多的方式

然後,我限制了列表的寬度。它有效,但你不能閱讀文本。

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

爲了更好地幫助越早,張貼[MCVE(http://stackoverflow.com/help/mcve)。 –

+0

您可能需要[JScrollPane](http://docs.oracle.com/javase/7/docs/api/javax/swing/JScrollPane.html)。來自[Oracle Docs]的示例(http://docs.oracle.com/javase/tutorial/uiswing/components/scrollpane.html) – vutran

+1

我不認爲JList能夠做到這一點,因爲行預計是相同的高度 – MadProgrammer

回答

1

我認爲這解決了您的問題。所有學分均爲Hovercraft Full Of Eels。我只是重新格式化他的代碼並添加了一些解釋,這對我來說似乎更有幫助。

所有你需要做的是使用自定義CellRendererjList,像下面這樣:

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