向JList添加对象



我有一个对象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);
});

最新更新