2012-09-26 40 views
1

我使用JcomboBox作爲一個建議框,當用戶輸入時,它檢查匹配並顯示建議。 這裏是我創建的JComboBox:JComboBox在getItemCount()>時顯示空白區域0

Vector<String> popUpVector = new Vector<String>(); 
    JComboBox jcb = new JComboBox(popUpVector); 

每次按鍵偵聽器捕捉事件,我做這個

popUpVector.clear(); 
    jcb.hidhPopUp(); 
    for(String s : database){ 
    popUpVector.add(s); 
    } 
    jcb.showPopUp(); 

它的工作原理,只要我不從下拉列表中選擇項目。但是,一旦我從下拉列表中選擇了項目,dropDown將在之後顯示爲空白,然後我檢查popUpVector,但它不是空的,但我認爲它與選擇有關,所以我從actionListener中解開它, t有幫助。

任何人都可以幫助我,非常感謝!

回答

2

傳遞一個VectorJComboBox constructo R將根據源確實使用矢量背底層模型:

public JComboBox(Vector<?> items) { 
    super(); 
    setModel(new DefaultComboBoxModel(items)); 
    init(); 
} 

public DefaultComboBoxModel(Vector<?> v) { 
    objects = v; 

    if (getSize() > 0) { 
     selectedObject = getElementAt(0); 
    } 
} 

這意味着如果你改變了向量的內容,你也改變模型的內容。但是,對模型進行更改需要啓動正確的事件以通知有關更改的視圖。由於向量不會觸發任何事件,所以DefaultComboBoxModel無法知道向量的內容已被更改。 因此,構造函數簡單地應該從矢量中取出元素並存儲那些直接存儲矢量的iso。

現在要解決您的問題:不要將您的值存儲在Vector中,請使用DefaultComboBoxModel並使用該模型上的可用API進行更改。使用API​​將確保模型啓動正確的更改。例如,見addElement方法的實現:

public void addElement(Object anObject) { 
    objects.addElement(anObject); 
    fireIntervalAdded(this,objects.size()-1, objects.size()-1); 
    if (objects.size() == 1 && selectedObject == null && anObject != null) { 
     setSelectedItem(anObject); 
    } 
} 
+0

感謝您的解釋,我現在嘗試使用defaultModel,並且遇到了另一個問題,它會自動完成我輸入的任何內容。這是一種方法來禁用此? –

+0

@GaZhua正如你可以從構造函數中看到的矢量,使用矢量或設置你自己的'DefaultComboBoxModel'完全一樣,除了你可以輕鬆訪問模型。所以自動完成部分或者已經與矢量一起出現,或者您剛添加。但這是一個不同的問題,我不會在評論中回答 – Robin

2

您的問題是

popUpVector.clear(); 

清除Vector正確的做法是隻

popUpVector = new Vector<String>(); 
更好

可能是add/remove/modifyJComboBoxes ItemsComboBoxModel

+0

創建一個新的載體是解決不了問題。在這種情況下,彈出窗口將包含所有舊值 – Robin