我使用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取消它,它没有帮助
任何人都可以帮助我,非常感谢!
答案 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