Добавление объектов в JList

95
11

У меня есть объект - 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, поэтому у меня будут указанные выше функции?

спросил(а) 2020-04-04T01:04:56+03:00 3 месяца назад
1
Решение
85

A 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/

ответил(а) 2020-04-04T01:21:04.591864+03:00 3 месяца назад
55

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


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

ответил(а) 2020-04-04T01:04:56+03:00 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема