2

我使用 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();

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

谁能帮帮我,非常感谢!

4

2 回答 2

3

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

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

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

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

这意味着如果您更改向量的内容,您也会更改模型的内容。但是,对模型进行更改需要触发正确的事件以通知视图有关更改。而且由于 vector 不会触发任何事件,DefaultComboBoxModel因此无法知道 vector 的内容已更改。所以imoDefaultComboBoxModel构造函数应该简单地从向量中获取元素并直接存储那些存储向量的iso。

现在解决您的问题:不要将您的值存储在 a 中Vector,而是使用 aDefaultComboBoxModel并使用该模型上可用的 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 );
    }
}
于 2012-09-26T07:39:57.923 回答
1

你的问题是

popUpVector.clear();

清除的正确方法Vector只是

popUpVector = new Vector<String>();

更好的可能是add//在ComboBoxModelremovemodifyJComboBoxes Items

于 2012-09-26T07:07:50.203 回答