мой jComboBox не реагирует на мой keyListener, а actionPerform выполняет запутанные вещи

Я пытаюсь найти имя пользователя и вернуть значения в 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);
}

после того, как вы щелкнете где-нибудь еще или нажмете ввод, он выполнит поиск, однако он снова начнет поиск первого элемента, что очень сбивает с толку ... затем я попытался использовать клавишу Pressed

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);
}

А этот никак не реагирует.


person Shuyi    schedule 01.02.2011    source источник


Ответы (3)


Ничего себе, вы каждый раз перестраиваете ComboBoxModel? Разве это не немного дорого? Вы знаете, что существует MutableComboBoxModel, также реализованный by 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 отображая только имя пользователя.

person Riduidel    schedule 01.02.2011
comment
Большое спасибо... проблема в том, что наши лекторы учат нас только базовым понятиям, ListcellRenderer и MutableModelEvent слишком сложны... ха-ха - person Shuyi; 01.02.2011
comment
Извините за грубость, но вы знаете, что все эти Javadocs доступны непосредственно на странице JComboBox. Как следствие, как профессиональный разработчик, я ожидаю, что вы прочитаете эту документацию и будете ее использовать. - person Riduidel; 01.02.2011

Вам нужно установить прослушиватель(и) в редакторе, а не в самом ComboBox. Смотрите ответ здесь:

Определение, когда пользователь нажимает ввод в Java

person jricher    schedule 01.02.2011

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);
}
person JB Nizet    schedule 01.02.2011