2013-02-17 29 views
6

Tôi làm cách nào để tìm nạp thành phần từ JList, với vị trí nhấp chuột?Lấy một thành phần từ JList bằng cách nhấp vào vị trí

Tôi có trình kết xuất ô của danh sách riêng nơi tôi chèn một số ô và nhãn. Bây giờ tôi muốn có được ví dụ nhãn nơi người dùng nhấp vào.

Tôi đã thử phương pháp list.getComponentAt(evt.getPoint()); nhưng chỉ trả lại toàn bộ JList.

+0

Đối với một 'JList', hãy thêm ['ListSelectionListener'] (http://docs.oracle.com/javase/7/docs/api/javax/swing/event/ListSelectionListener.html). Để được trợ giúp tốt hơn sớm hơn, hãy đăng một [SSCCE] (http://sscce.org/). –

+3

'JList' không chứa bất kỳ thành phần nào. Nó sử dụng 'ListCellRenderer' để vẽ một" con dấu cao su "của thành phần vào danh sách. Có nghĩa là, mỗi phần tử trong danh sách được trả về bằng cách sử dụng cùng một/duy nhất 'ListCellRenderer' – MadProgrammer

Trả lời

17

tôi đã không kiểm tra này, nhưng những điều cơ bản sẽ là ...

  1. Sử dụng JList#locationToIndex(Point) để có được những chỉ số của phần tử tại điểm nhất định.
  2. Lấy "phần tử" tại chỉ mục được chỉ định (sử dụng JList#getModel#getElementAt(int)).
  3. Nhận ListCellRenderer sử dụng JList#getCellRenderer.
  4. Render nguyên tố này và nhận được nó Component đại diện
  5. Đặt giới hạn của renderer để giới hạn tế bào cần
  6. Chuyển đổi bản gốc Point đến Component s bối cảnh
  7. Sử dụng getComponentAt trên renderer ...

Có thể, một cái gì đó như ...

int index = list.locationToIndex(p); 
Object value = list.getModel().getElementAt(int); 
Component comp = listCellRenderer.getListCellRendererComponent(list, value, index, true, true); 
comp.setBounds(list.getCellBounds(index, index)); 
Point contextPoint = SwingUtilities.convertPoint(list, p, comp); 
Component child = comp.getComponentAt(contextPoint); 
2

Tác phẩm của MadProgrammer miễn là người dùng không nhấp vào bên ngoài một ô. Nếu anh ta làm điều đó, chỉ mục được trả về bởi locationToIndex() sẽ là ô của chỉ mục cuối cùng, vì vậy điểm được chuyển đổi sẽ là "dưới" thành phần được hiển thị

Để kiểm tra xem người dùng có thực sự nhấp vào một ô bạn phải làm không:

int index = list.locationToIndex(p); 
if (index > -1 && list.getCellBounds(index, index).contains(p)){ 
    // rest of MadProgrammer solution 
    ... 
} 
+0

Điều này giải quyết được vấn đề tôi gặp ở bất cứ khi nào tôi nhấp vào bên dưới các mục danh sách, nó sẽ luôn nhận được thành phần cuối cùng. – TraderJosh

Các vấn đề liên quan