Добавление объектов в JList - PullRequest
5 голосов
/ 01 марта 2012

У меня есть объект - ArrayList<User> users, который содержит несколько пользовательских объектов.

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

Я хочу поместить этот ArrayList в JList, чтобы он отображал имена пользователей -

John
Mick
Sam
Joe

--- И когда я выбираю имя пользователя, запускается событие, которое позволяет мне выполнить какое-то действие, используя соответствующий объект User.Поэтому кто-то нажимает «Мик», и я получаю код, подобный этому (псевдокод) -

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 ]

4 голосов
/ 01 марта 2012

JList принимает в своем конструкторе Object []. Вы можете получить это из вашего ArrayList с помощью функции .toArray(). Я считаю (я могу ошибаться ...), что если ваш класс User переопределяет метод toString(), JList будет использовать его при отображении вашего объекта.

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

    public String toString() {
      return name;
    }
}

Я бы порекомендовал прочитать документацию по JList в документации по Java. В нем есть пример того, как создать пользовательский модуль визуализации ячеек, чтобы элементы отображались в вашем списке так, как вы хотите, чтобы они отображались. Это довольно легко следовать. В нем также есть пример того, как создать слушатель щелчка мыши. Вы должны быть в состоянии скопировать / вставить это по большей части.

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

1 голос
/ 28 июля 2015

Конструктор JList, о котором мы заботимся в этом случае, принимает массив объектов, как уже указывал Тони. Вот где его ответ перестает быть полезным (без обид, Тони).

По умолчанию ListCellRenderer, который использует JList, добавляет JLabels, которые содержат текст из Object # toString (). Таким образом, вместо передачи Strings вы хотите передать ему массив ваших пользовательских объектов, а затем добавить ListSelectionListener (который используется после того, как пользователь нажимает на JList) и ListCellRenderer (который определяет, как объект User переводится в 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);
});
...