мой jComboBox не реагирует на мой keyListener, а actionPerform выполняет ненужные вещи - PullRequest
0 голосов
/ 01 февраля 2011

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

А этот вообще не реагирует.

Ответы [ 3 ]

2 голосов
/ 01 февраля 2011

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

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

1 голос
/ 01 февраля 2011

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

1 голос
/ 01 февраля 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);
}
...