2010-11-20 22 views
5

Mục tiêu cuối cùng của tôi là có một JList làm mới nội dung của nó trong thời gian chạy và tôi đã tìm được giải pháp hoạt động từ bài đăng này here on SO. ý tưởng ban đầu của tôi thì không.Sử dụng phương thức JList .setModel() với một lớp làm đối số

Tính đến bây giờ, tôi có một cái gì đó giống như thiết lập này và nó hoạt động:

DefaultListModel default = new DefaultListModel(); 

for(int i = 0; i < array.size() ; ++i){ 
    test.addElement(array.get(i)); 
} 
list.setModel(default); 

Dưới đây là kế hoạch ban đầu của tôi. Tôi muốn có một lớp học mà thực hiện ListModel được thông qua như một đối số, hy vọng nó sẽ làm mới JList.

SomeClass test = new SomeClass(); //Implements ListModel 
list.setModel(test); 

hoặc

SomeClass test = new SomeClass(); //Implements ListModel 
list = new JList(test); 

Cả những nơi làm việc, trong đó bối rối cho tôi. Có thể hai phương pháp cuối cùng này làm việc một số cách, mã này sạch hơn rất nhiều.

Cảm ơn.

+0

Chuyển một lớp ListModel thay vì một thể hiện của lớp này là lỗi bộ biên dịch. Tại sao bạn bối rối? – Istao

+0

Tôi nghĩ bản giới thiệu mã của tôi hơi tiếc một chút. Thats những gì tôi đã làm, tôi sẽ thay đổi mã để làm cho điều này rõ ràng hơn. – Koop

+1

Tại sao hai phương pháp cuối không hoạt động? Vui lòng cung cấp lỗi mà bạn đang gặp phải. Nếu 'SomeClass' mở rộng' ListModel', thì cả hai phương thức đó sẽ hoạt động. –

Trả lời

3

Cách tiếp cận đầu tiên sẽ hoạt động nếu bạn triển khai ListModel chính xác. Điều quan trọng là khi bạn thay đổi dữ liệu bạn cần gọi:

fireContentsChanged(...); 

từ AbstractListModel (mà tôi giả sử bạn mở rộng). Gọi phương thức này sẽ báo cho JList tự vẽ lại.

Cách tiếp cận thứ hai sẽ không hoạt động vì bạn chỉ cần tạo thành phần JList mới đang nằm trong bộ nhớ. Tạo thành phần không thêm nó vào GUI. Vì vậy, nếu bạn sử dụng cách tiếp cận này, bạn cần phải loại bỏ các JList ban đầu từ GUI và sau đó thêm JList mới của bạn vào GUI. Điều này không phải là rất thuận tiện và là một lý do chính đáng tại sao phương pháp này không nên được sử dụng. Đặt mô hình luôn là cách tiếp cận ưa thích.

+0

là fireContentsChanged() được coi là một phần của AbstractListModel hoặc một phương thức tùy chỉnh? Ngoài ra, điều này chỉ đơn giản là nhắc lại thông qua tất cả các giá trị? Cảm ơn. – Koop

+0

Khi bạn thêm một ListModel vào một JList, JList sẽ thêm một người nghe vào mô hình. Khi bạn thay đổi mô hình, mô hình sẽ thông báo chế độ xem (danh sách) mà dữ liệu đã thay đổi để chế độ xem có thể tự vẽ lại. Thông báo này được thực hiện bằng các phương thức fireXX là một phần của AbstractListModel. Đó là lý do tại sao khi bạn tạo một mô hình tùy chỉnh, bạn nên mở rộng mô hình trừu tượng cho bạn không cần phải tái tạo lại bánh xe và thông báo cho khung nhìn. Tất cả những gì bạn làm là gọi phương thức fireXXX approriate. – camickr

1

Trường hợp đầu tiên có vẻ như là một giải pháp trong đầu tôi. Bạn có thể cung cấp một ví dụ có thể kiểm chứng được không?

Trường hợp thứ hai sẽ không hoạt động vì bạn chỉ đang sử dụng lại biến và không thực sự thay đổi JList trên Gui. Tôi giả sử bạn đã thêm danh sách này vào anh chàng trước đó trong mã.

0

Nhiều khả năng việc triển khai ListModel của bạn là sai.

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