2012-03-01 24 views
5

Mam obiekt - ArrayList<User> users zawierający kilka obiektów użytkownika.Dodawanie obiektów do obiektu JList

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

Chcę umieścić ten ArrayList w JList więc będzie wyświetlać nazwy użytkowników -

John 
Mick 
Sam 
Joe 

--- A kiedy wybrać nazwę użytkownika zdarzenie jest opalane że pozwala mi wykonywać niektóre czynność za pomocą odpowiedniego obiektu użytkownika. Więc ktoś kliknie „Mick” i mam kod jak to (Pseudokod) -

public jListClicked(User user) 
{ 
    int id = user.id; 
    String name = user.name; 
    String location = user.location; 

    updateDatabase(id, name, location); 
} 

Przypuszczam, jest to możliwe przy użyciu JList ?? W końcu wyobrażam sobie, że to jest to, do czego został stworzony komponent JList. W jaki sposób dodać obiekt do ArrayList do JList, więc będę mieć powyższą funkcjonalność?

+2

pewny, wszystko jest możliwe Swing :-) Należy przeczytać i zrozumieć podstawowe samouczka f.i. http://docs.oracle.com/javase/tutorial/uiswing/index.html – kleopatra

Odpowiedz

4

JList przyjmuje jeden z jego konstruktorów obiekt []. Możesz to uzyskać z tablicy ArrayList za pomocą funkcji .toArray(). Wierzę (mógłbym się mylić ...), że jeśli twoja klasa użytkownika zastąpi metodę toString(), JList użyje jej, gdy wyświetli twój obiekt.

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

    public String toString() { 
     return name; 
    } 
} 

Polecam czytanie dokumentacji dla JList w dokumentacji java. Ma przykład, jak zbudować niestandardowy renderer komórki, aby wyświetlić elementy na liście w taki sposób, w jaki mają być wyświetlane. To dość łatwe do naśladowania. Ma również przykład, jak utworzyć obiekt nasłuchujący myszy. Powinieneś być w stanie skopiować/wkleić to w przeważającej części.

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

+0

Prawidłowo, [domyślny mechanizm renderujący] (http://docs.oracle.com/javase/tutorial/uiswing/components/list.html# renderer) wyświetla obiekty nie będące ikonami, wywołując 'toString()'. – trashgod

+3

-1 dla przesłonięcia toString ze względu na wyświetlenie. Metoda Swing niestandardowej reprezentacji wizualnej jest niestandardowym narzędziem ListCellRenderer. – kleopatra

+1

@kleopatra stanowi cenny punkt; link [samouczek JList'a] (http://docs.oracle.com/javase/tutorial/uiswing/components/list.html) poprawiłby tę odpowiedź. – trashgod

1

Konstruktor JList że zależy nam na tym przypadku bierze tablicę obiektów, jak już zauważył Tony. Chodzi o to, gdzie jego odpowiedź przestaje być przydatna (bez obrazy Tony).

Domyślnie narzędzie ListCellRenderer używane przez bibliotekę JList dodaje wartości JLabels zawierające tekst z Object # toString(). Tak więc, zamiast przekazywać ciągi, chcesz przekazać mu tablicę swoich obiektów użytkownika, a następnie dodać ListSelectionListener (który jest używany po kliknięciu przez użytkownika na JList) i ListCellRenderer (który określa, w jaki sposób obiekt użytkownika jest tłumaczony na JComponent które będą rysowane jako część JList).

Chcesz zrobić coś takiego (patrz komentarze inline szczegóły):

//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); 
}); 
Powiązane problemy