簡體   English   中英

使用自定義渲染器在jComboBox中顯示值時出錯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM