![](/img/trans.png)
[英]Using JComboBox with custom renderer as JTable cell renderer/editor (architecture)
[英]Error using custom renderer to show value in jComboBox
我已經研究並嘗試從包含Publisher對象的數組列表中動態填充jcombobox。 我試圖實現一個渲染器,以便使用getName()方法顯示發布者的名稱。 組合框顯示程序運行時的名稱,但是,如果隨后將新的Publisher添加到ArrayList,則組合框將變為空白。
創建模型:
public class PublisherComboBoxModel implements ComboBoxModel{
protected List<Publisher> publishers;
public PublisherComboBoxModel(List<Publisher> list) {
this.listeners = new ArrayList();
this.publishers = list;
if(list.size() > 0) {
selected = list.get(0);
}
}
protected Object selected;
@Override
public void setSelectedItem(Object item) {
this.selected = item;
}
@Override
public Object getSelectedItem() {
return this.selected;
}
@Override
public Object getElementAt(int index) {
return publishers.get(index);
}
@Override
public int getSize() {
return publishers.size();
}
protected List listeners;
@Override
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
@Override
public void removeListDataListener(ListDataListener l) {
this.listeners.remove(l);
}
}
創建渲染器:
jComboBoxPublisher.setModel(publisherComboModel);
jComboBoxPublisher.setRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
Publisher publisher = (Publisher)value;
if(value!=null)
{
value = publisher.getName();
}
return super.getListCellRendererComponent(list, value,
index, isSelected, cellHasFocus);
}
這不一定是答案,而是突出了潛在的問題
瀏覽代碼時,我注意到組合框模型只是在維護對原始列表的引用。 這不一定是問題,但可能會導致一些意外的和潛在的有害行為……
主要問題在於,組合框模型不知道何時更改列表,因此無法告訴組合框應更新列表。
一般情況下,我通常會做的是使一個新的List
原來的名單。 這意味着,如果原始文件被更新,則不會導致模型和組合框出現問題。
然后,我將突變功能添加到組合框模型,以便可以對其進行更新,例如...
public class PublisherComboBoxModel extends AbstractListModel implements ComboBoxModel {
private List<Publisher> publishers;
private Publisher selectedItem;
public PublisherComboBoxModel(List<Publisher> publishers) {
this.publishers = new ArrayList<>(publishers);
}
public void addPublisher(Publisher pub) {
publishers.add(pub);
fireIntervalAdded(this, publishers.size() - 1, publishers.size() - 1);
}
@Override
public int getSize() {
return publishers.size();
}
@Override
public Object getElementAt(int index) {
return publishers.get(index);
}
@Override
public void setSelectedItem(Object anItem) {
selectedItem = (Publisher) anItem;
}
@Override
public Object getSelectedItem() {
return selectedItem;
}
}
這個想法有幾種選擇。 您可以創建一個“通用”模型,該模型列出了發布者,但向感興趣的參與者提供了事件通知,因此,當您從該模型中添加或刪除發布者時,將通知感興趣的參與者,如組合框模型,並有機會更新自己,並將適當的通知轉發給他們感興趣的各方。
就個人而言,在較大規模的應用程序中,這是我的首選方法。
另一種方法是為組合框模型提供直接通知。
就是說,您將按原樣維護對現有列表的引用,但是組合框模型將具有您可以調用的方法,然后可以將其轉發。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.