我正在尝试搜索UserName并将值返回到jComboBox,这是代码
public void actionPerformed(java.awt.event.ActionEvent e) {
sr = new Search(((String) jComboBoxReceiver.getSelectedItem()));
usrList = sr.searchUser();
String[] userList = new String[usrList.size()] ;
for(int i=0;i<usrList.size();i++){
userList[i]= usrList.get(i).getUserName();
}
model = new DefaultComboBoxModel(userList);
jComboBoxReceiver.setModel(model);
}
点击其他地方或点击回车后,它会进行搜索,但是,它会再次搜索第一个项目,这非常令人困惑......然后我尝试使用按键
if(e.getKeyCode()==13){
sr = new Search(((String) jComboBoxReceiver.getSelectedItem()));
usrList = sr.searchUser();
String[] userList = new String[usrList.size()] ;
for(int i=0;i<usrList.size();i++){
userList[i]= usrList.get(i).getUserName();
}
model = new DefaultComboBoxModel(userList);
jComboBoxReceiver.setModel(model);
}
这个根本没有反应。
答案 0 :(得分:2)
您需要在编辑器上设置侦听器而不是ComboBox本身。请参阅答案:
答案 1 :(得分:1)
IMO,对您的用户来说真正令人困惑的是,只要选择其中一个选项,就会更改组合框的内容和选择。
无论如何,如果您真的想这样做,那么您应该在更改其内容之前删除动作侦听器(或停用它),并在以下情况之后重新添加(或重新激活它):
public void actionPerformed(java.awt.event.ActionEvent e) {
sr = new Search(((String) jComboBoxReceiver.getSelectedItem()));
usrList = sr.searchUser();
String[] userList = new String[usrList.size()] ;
for(int i=0;i<usrList.size();i++){
userList[i]= usrList.get(i).getUserName();
}
model = new DefaultComboBoxModel(userList);
jComboBoxReceiver.removeActionListener(this);
jComboBoxReceiver.setModel(model);
jComboBoxReceiver.addActionListener(this);
}
答案 2 :(得分:1)
MutableComboBoxModel
,也是由DefaultComboBoxModel
实现的,你可以在不重建模型的情况下添加/删除组合框中的元素吗?
关于你的问题,我不理解声明
但是,如果我这样做,它确实正常运行,但是,它会再次搜索第一个项目
你的意思是你的JComboBox每次都会因为内容被修改而开始闪烁吗?
如果是这样,也许是因为您的ActionListener
与JComboBox
相关联,哪些内容会不断变化。
无论如何,我建议你添加一些日志,比如
sr = new Search(((String) jComboBoxReceiver.getSelectedItem()));
DefaultComboBoxModel model = (DefaultComboBoxModel) jComboBoxReceiver.getModel();
model.remvoeAllElements();
usrList = sr.searchUser();
String[] userList = new String[usrList.size()] ;
for(int i=0;i<usrList.size();i++){
String username = usrList.get(i).getUserName();
System.out.println(username); // feel free to instead use one loger
model.addElement(username);
}
此外,我倾向于建议你另一种方法,其中组合框模型不包含简单的字符串,而是包含用户对象,ListCellRenderer
仅显示用户名。