Việc triển khai Observable
trong Java hiếm khi được sử dụng và không liên kết tốt với Swing. Sử dụng một số EventListener
để thay thế.
Cụ thể, có lý do không để mở rộng AbstractListModel
hoặc thậm chí sử dụng DefaultListModel
trực tiếp khi quản lý nội dung của danh sách "ở nơi khác trong GUI"? Sau đó, hộp kết hợp của bạn có thể sử dụng một ComboBoxModel
đại biểu cho cùng một trường hợp ListModel
, thêm việc triển khai của chính nó để theo dõi trạng thái lựa chọn.
tôi có trong tâm trí một cái gì đó như thế này (nhưng tôi đã không kiểm tra nó):
final class MyComboBoxModel
extends AbstractListModel
implements ComboBoxModel
{
private final ListModel data;
private volatile Object selection;
MyComboBoxModel(ListModel data) {
/*
* Construct this object with a reference to your list,
* which contents are managed somewhere else in the UI.
*/
this.data = data;
data.addListDataListener(new ListDataListener() {
public void contentsChanged(ListDataEvent evt) {
fireContentsChanged(this, evt.getIndex0(), evt.getIndex1());
}
public void intervalAdded(ListDataEvent evt) {
fireContentsChanged(this, evt.getIndex0(), evt.getIndex1());
}
public void intervalRemoved(ListDataEvent evt) {
fireContentsChanged(this, evt.getIndex0(), evt.getIndex1());
}
});
}
public void setSelectedItem(Object selection) {
this.selection = selection;
fireContentsChanged(this, 0, data.getSize() - 1);
}
public Object getSelectedItem() { return selection; }
public int getSize() { return data.getSize(); }
public Object getElementAt(int idx) { return data.getElementAt(idx); }
}
Bạn đang đề cập đến một JComboBox? Nếu vậy, tôi sẽ nhìn vào ComboBoxModel và triển khai của nó. – Avrom