我有一个对象ArrayList<User> users
,它包含一些用户对象。
public class User
{
int id;
String name;
String location;
}
我想把这个ArrayList放在JList中,这样它就会显示用户名-
John
Mick
Sam
Joe
---当我选择用户名时,会触发一个事件,让我使用适当的user对象执行一些操作。所以有人点击"Mick",我得到这样的代码(伪代码)-
public jListClicked(User user)
{
int id = user.id;
String name = user.name;
String location = user.location;
updateDatabase(id, name, location);
}
我认为使用JList是可能的??毕竟,我认为这就是创建JList组件的目的。那么,如何将像ArrayList这样的对象添加到JList中,以便具有上述功能呢?
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/
正如Tony已经指出的,我们在本例中关心的JList构造函数采用一个Object数组。这就是他的答案不再有用的地方(无意冒犯托尼)。
默认情况下,JList使用的ListCellRenderer会添加JLabels,其中包含Object#toString()中的文本。因此,您不想传递Strings,而是想向它传递一个User对象的数组,然后添加一个ListSelectionListener(在用户单击JList后使用)和一个ListCellRenderer(决定如何将User对象转换为JComponent,该JComponement将作为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.setCellRenderer(new DefaultListCellRenderer(){
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);
});