2009-04-13 31 views
6

Bất cứ khi nào tôi tạo trình kết xuất ô tùy chỉnh cho một JList, mọi phần tử tôi thêm vào không bao giờ phản hồi lại các hành động. Ví dụ, nếu tôi có trình kết xuất đồ họa trả về một JPanel với các phần tử trên đó, một trong số đó có một ActionListener, nó không trả lời gì cả.Java Swing - Hiển thị ô tùy chỉnh JList - chụp các hành động

Tại sao điều này?

+1

Câu hỏi rất hay. Tôi nghĩ rằng nó có thể có một cái gì đó để làm với ItemListeners, nhưng bây giờ tôi không nghĩ như vậy ... Tôi đã cố gắng tìm mã mẫu nhưng không thành công. – Uri

+0

Xin chào, tôi gặp phải vấn đề tương tự, bạn có thể giải quyết được sự cố không? – user236501

Trả lời

6

Mục bạn trả về dưới dạng trình kết xuất ô danh sách được thiết kế để chính xác: hiển thị. Đăng ký người nghe với JList (nói chung, bạn sẽ muốn một ListSelectionListener).

11

Các renderer có thể trông giống như một nhà máy trả lại các thành phần cho các tế bào, nhưng trên thực tế nó theo hạng ruồi render cách tiếp cận và sử dụng cùng phần cho rendering tất cả các ô (mỗi cuộc gọi đến getListCellRendererComponent() là nghĩa vụ phải cấu hình lại cùng một cá thể thành phần cho một ô cụ thể và trả về nó để ô có thể được hiển thị).

Bằng cách đó, bạn có thể có JList (cũng như JTableJTree) hiển thị số lượng lớn ô mà không cần phải instanciate thành phần cho mỗi ô. Là một tác dụng phụ, thành phần render không thể đáp ứng với các sự kiện, vì nó chỉ được sử dụng trong vòng lặp render, nhưng không xuất hiện trong cây thành phần.

Cũng như Neil Coffey nói, bạn có thể thêm các thính giả của mình vào JList (JTable, JTree) thay vào đó, và sử dụng các phương pháp helper (locationToIndex(...), getCellBounds(...)) để gửi mà tế bào bị ảnh hưởng và do đó đối phó với logic cụ thể của tế bào.

+1

+1 cho một lời giải thích khá – basszero

+1

Hãy suy nghĩ của các thành phần trả lại như một con dấu cao su. –

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