2012-03-01 73 views
5

Tôi có một đối tượng - ArrayList<User> users có chứa một vài đối tượng người dùng.Thêm đối tượng vào một JList

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

Tôi muốn đặt ArrayList này trong JList vì vậy nó sẽ hiển thị tên người dùng -

John 
Mick 
Sam 
Joe 

--- Và khi tôi chọn một tên người dùng một sự kiện được bắn cho phép tôi thực hiện một số hành động bằng cách sử dụng đối tượng User thích hợp. Vì vậy, ai đó nhấp vào 'Mick' và tôi nhận được mã như thế này (mã giả) -

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

    updateDatabase(id, name, location); 
} 

Tôi đoán điều này có thể sử dụng một JList ?? Sau khi tất cả tôi tưởng tượng đó là những gì các thành phần JList đã được tạo ra cho. Vì vậy, làm thế nào để tôi thêm một đối tượng như ArrayList vào một JList vì vậy tôi sẽ có các chức năng trên?

+2

chắc chắn, mọi thứ đều có thể với Swing :-) Hãy chắc chắn bạn đã đọc và hiểu một hướng dẫn cơ bản, f.i. http://docs.oracle.com/javase/tutorial/uiswing/index.html – kleopatra

Trả lời

4

Một JList nhận một trong một hàm tạo của nó là Object []. Bạn có thể lấy nó từ ArrayList của bạn với hàm .toArray(). Tôi tin rằng (tôi có thể sai ...) nếu lớp người dùng của bạn ghi đè phương thức toString(), thì JList sẽ sử dụng phương thức này khi nó hiển thị đối tượng của bạn.

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

    public String toString() { 
     return name; 
    } 
} 

Tôi khuyên bạn nên đọc tài liệu cho JList trong tài liệu java. Nó có một ví dụ về làm thế nào để xây dựng một renderer ô tùy chỉnh để hiển thị các mục trong danh sách của bạn theo cách bạn muốn chúng được hiển thị. Nó khá dễ làm theo. Nó cũng có một ví dụ về cách tạo trình nghe click chuột. Bạn sẽ có thể sao chép/dán phần này.

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

+0

Đúng, [trình kết xuất mặc định] (http://docs.oracle.com/javase/tutorial/uiswing/components/list.html# renderer) hiển thị các đối tượng không phải biểu tượng bằng cách gọi 'toString()'. – trashgod

+3

-1 để ghi đè lênString vì lý do hiển thị. Cách Swing của đại diện trực quan tùy chỉnh là một ListCellRenderer tùy chỉnh. – kleopatra

+1

@kleopatra làm cho một điểm có giá trị; một liên kết [hướng dẫn JList'] (http://docs.oracle.com/javase/tutorial/uiswing/components/list.html) sẽ cải thiện câu trả lời này. – trashgod

1

Các JList xây dựng mà chúng tôi quan tâm đối với trường hợp này phải mất một mảng của các đối tượng, như Tony đã chỉ ra. Đó là về nơi mà câu trả lời của anh ta dừng lại là hữu ích (không có vi phạm Tony).

Theo mặc định, ListCellRenderer mà JList sử dụng thêm JLabels chứa văn bản từ Object # toString(). Vì vậy, thay vì đi qua các chuỗi, bạn muốn truyền cho nó một mảng các đối tượng người dùng của bạn, sau đó thêm một ListSelectionListener (được sử dụng sau khi người dùng nhấp vào JList) và một ListCellRenderer (xác định cách đối tượng User được dịch thành JComponent sẽ được vẽ như một phần của JList).

Bạn muốn làm một cái gì đó như thế này (xem ý kiến ​​inline để biết chi tiết):

//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); 
}); 
Các vấn đề liên quan