2012-03-01 83 views
5

我有一個對象 - ArrayList<User> users,它包含幾個用戶對象。將對象添加到JList

public class User 
{ 
    int id; 
    String name; 
    String location; 
} 

我想把此ArrayList將在JList所以它會顯示用戶名 -

John 
Mick 
Sam 
Joe 

---當我選擇一個用戶名觸發一個事件,讓我進行一些使用適當的用戶對象進行操作。所以有人點擊'米克',我得到這樣的代碼(僞代碼) -

public jListClicked(User user) 
{ 
    int id = user.id; 
    String name = user.name; 
    String location = user.location; 

    updateDatabase(id, name, location); 
} 

我認爲這是可能的使用JList?畢竟我想象這是JList組件的創建目的。那麼如何將一個像ArrayList這樣的對象添加到JList中,這樣我就可以擁有上述功能了?

+2

肯定,一切皆有可能與Swing :-)請務必閱讀並瞭解基本教程,f.i. http://docs.oracle.com/javase/tutorial/uiswing/index.html – kleopatra 2012-03-01 12:59:57

回答

4

JList接受其構造函數的一個Object []。你可以使用.toArray()函數從你的ArrayList中得到這個。我相信(我可能是錯的...),如果你的User類覆蓋了toString()方法,JList將在它顯示你的對象時使用它。

public class User 
{ 
    int id; 
    String name; 
    String location; 

    public String toString() { 
     return name; 
    } 
} 

我會推薦閱讀java文檔中JList的文檔。它有一個如何構建自定義單元格渲染器的例子,以按照您希望顯示的方式顯示列表中的項目。這很容易遵循。它也有一個如何創建鼠標點擊偵聽器的例子。你應該能夠複製/粘貼大部分。

http://docs.oracle.com/javase/6/docs/api/

+0

正確,[默認渲染器](http://docs.oracle.com/javase/tutorial/uiswing/components/list.html#渲染器)通過調用'toString()'來顯示非圖標對象。 – trashgod 2012-03-01 02:44:03

+3

-1爲了顯示原因而重寫toString。自定義視覺表示的Swing方式是自定義ListCellRenderer。 – kleopatra 2012-03-01 12:56:10

+1

@kleopatra是一個有價值的觀點; ['JList'教程](http://docs.oracle.com/javase/tutorial/uiswing/components/list.html)的鏈接可以改善這個問題。 – trashgod 2012-03-01 18:34:26

1

,我們關心這種情況JList的構造函數接受對象的數組,託尼已經指出。這是關於他的答案停止有用的地方(Tony沒有違法)。

默認情況下,JList使用的ListCellRenderer會添加包含來自Object#toString()的文本的JLabel。因此,不是傳遞字符串,而是傳遞一個用戶對象數組,然後添加一個ListSelectionListener(在用戶單擊JList之後使用)和一個ListCellRenderer(它確定如何將用戶對象轉換爲JComponent這將被繪製爲JList的一部分)。

你想要做這樣的事(詳見在線評論):

//generate your user data 
User[] userData = ...; 

//add an array of Objects to a JList using the constructor 
//(all classes extend java.lang.Object, including User) 
JList foo = new JList(userData); 

//overwrite the ListCellRenderer. This will take care of just displaying 
//the name of the user 
foo.addListSelectionListener(new ListSelectionListener(){ 
    JLabel rv = new JLabel(); 
    @Override 
    public Component getListCellRendererComponent(JList list, 
      Object value, int index, boolean isSelected, 
      boolean cellHasFocus){ 
     String s = (value != null && value instanceof User)? ((User)value).name:""; 
     rv.setText(s); 
     if (isSelected) { 
      rv.setBackground(list.getSelectionBackground()); 
      rv.setForeground(list.getSelectionForeground()); 
     } else { 
      rv.setBackground(list.getBackground()); 
      rv.setForeground(list.getForeground()); 
     } 
     rv.setEnabled(list.isEnabled()); 
     rv.setFont(list.getFont()); 
     rv.setOpaque(true); 
     return rv; 
    } 
}); 

//Now overwrite the ListSelectionListener which will take care of getting 
//user object when the user clicks it 
foo.addListSelectionListener(new ListSelectionListener(){ 
    @Override 
    public void valueChanged(ListSelectionEvent lse) { 
     User selectedValue = (User)((JList)lse.getSource()).getSelectedValue(); 
     //now you can do something with the User Object that was just selected 
     updateDatabase(selectedValue.id, selectedValue.name, 
       selectedValue.location); 
});