当getItemCount()> 0时,JComboBox显示空白区域

时间:2012-09-26 05:59:10

标签: java swing vector popup jcombobox

我使用JcomboBox作为建议框,当用户输入时,它会检查匹配并显示建议。 以下是我创建JComboBox的方法:

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

每次Key Listener捕获事件时,我都会这样做

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

只要我不从下拉列表中选择项目,它就可以正常工作。 但是,一旦我从下拉列表中选择项目,dropDown将在之后显示为空白,我检查popUpVector,虽然它不是空的,我认为它与选择有关,所以我从actionListener取消它,它没有帮助

任何人都可以帮助我,非常感谢!

2 个答案:

答案 0 :(得分:3)

Vector传递给JComboBox构造函数将根据源确实使用该向量来支持底层模型:

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

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

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

这意味着如果更改向量的内容,还可以更改模型的内容。但是,对模型进行更改需要触发正确的事件以通知视图有关更改。由于vector不会触发任何事件,DefaultComboBoxModel无法知道向量的内容已被更改。 因此,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 );
    }
}

答案 1 :(得分:1)

你的问题是

popUpVector.clear();

清除Vector的正确方法仅为

popUpVector = new Vector<String>();

最好是add / remove / modify ComboBoxModel中的JComboBoxes Items