2013-03-03 79 views
0

我有一個對象列表Person (int age, String name),存儲在DefaultListModel中以分配給JList顯示來自模型的JList元素

DefaultListModel model; 
model = new DefaultListModel(); 

Person p = new Person(43,"Tom"); 
//insert in the model 
model.add(size, p); 

jList1.setModel(model); 

我想在JList只顯示名字,但我無法弄清楚如何做到這一點不使用名稱的另一份名單(我寧願避免)。

是否有任何簡單的方法可以告訴JList顯示對象Person的哪些屬性?

+0

閱讀這裏的討論:http://stackoverflow.com/questions/15173325/execute-an-action-when-an -item-on-the-combobox-is-selected-netbeans/15173525 – camickr 2013-03-03 23:36:56

回答

3

視圖的顯示應該是ListCellRenderer

喜歡的東西的領域...

public class PersonCellRenderer extends DefaultListCellRenderer { 
    public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
     super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
     if (value instanceof Person) { 
      setText(((Person)value).getName()); 
     } 
     return this; 
    } 
} 

要應用渲染到列表中,你需要做的......

jList1.setCellRenderer(new PersonCellRenderer()); 

查看Writing a Custom Cell Renderer獲取更多信息

+0

並且不要忘記編寫一個自定義的KeySelectionManager,因爲只使用渲染器會破壞組合框的默認功能。 – camickr 2013-03-04 00:03:28

+0

@camickr哈哈哈,知道這是來的;) - 但'JList'不支持'KeySelectionManager' – MadProgrammer 2013-03-04 00:08:01

+0

沒有注意:)你的權利,對JList更糟糕。相反,您必須重寫JList的getNextMatch(...)方法,這更糟糕,只需插入KeySelectionManager即可。這是我不喜歡這種方法的另一個原因。用戶不關心代碼,他們只是想看到標準功能。不要忘記在Person類上實現Comparable,以便在列表中顯示時按照適當的順序排列人員。這麼多額外的工作要做... – camickr 2013-03-04 00:30:36

1

S暗示覆蓋Person類的toString()方法以返回Person的名稱

DefaultListModel model; 
model = new DefaultListModel(); 

Person p = new Person(43,"Tom"); 
//insert in the model 
model.add(size, p); 

jList1.setModel(model); 

public class Person { 

    private int age; 
    private String name; 

    public Person(int age, String name) { 
    this.age = age; 
    this.name = name; 
    } 

    public String getName() { 
    return name; 
    } 

    public String toString() { 
    return this.getName(); 
    } 
}