2012-03-01 198 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); 
});