2012-03-01 3 views
5

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

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

уверен, все это возможно с свинг :-) Убедитесь, что вы прочитали и поняли основной учебник, F.I. http://docs.oracle.com/javase/tutorial/uiswing/index.html – kleopatra

ответ

4

JList берет в один из своих конструкторов объект []. Вы можете получить это из своего 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/

+0

Исправить [средство визуализации по умолчанию] (http://docs.oracle.com/javase/tutorial/uiswing/components/list.html# renderer) отображает объекты без значков, вызывая 'toString()'. – trashgod

+3

-1 для переопределения toString для отображения причин. Способ Swing пользовательского визуального представления - это пользовательский ListCellRenderer. – kleopatra

+1

@ kleopatra делает ценный момент; ссылка ['JList' tutorial] (http://docs.oracle.com/javase/tutorial/uiswing/components/list.html) улучшит этот ответ. – trashgod

1

Конструктор 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); 
}); 
Смежные вопросы