我的jComboBox没有对我的keyListener做出反应,而actionPerformed会执行奇怪的东西

时间:2011-02-01 15:19:48

标签: java swing jcombobox listeners comboboxmodel

我正在尝试搜索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);
}

这个根本没有反应。

3 个答案:

答案 0 :(得分:2)

您需要在编辑器上设置侦听器而不是ComboBox本身。请参阅答案:

Detecting when user presses enter in Java

答案 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)

哇,你每次都在重建一个ComboBoxModel?这不贵吗?你知道有一个MutableComboBoxModel,也是由DefaultComboBoxModel实现的,你可以在不重建模型的情况下添加/删除组合框中的元素吗?

关于你的问题,我不理解声明

  

但是,如果我这样做,它确实正常运行,但是,它会再次搜索第一个项目

你的意思是你的JComboBox每次都会因为内容被修改而开始闪烁吗?

如果是这样,也许是因为您的ActionListenerJComboBox相关联,哪些内容会不断变化。

无论如何,我建议你添加一些日志,比如

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仅显示用户名。