2015-07-24 1 views
2

У меня есть редактируемый JComboBox с одним слушателем на нем.Редактируемый JCombobox избегает нескольких DocumentEvents, когда выбор изменяется из всплывающего окна

Это DocumentListener, что выполнить некоторый код, когда вставка пользователя или удалить какой-нибудь текст внутри выпадающий список TextField:

((JTextComponent)combobox.getEditor().getEditorComponent()).getDocument().addDocumentListener(..) 

Моя проблема заключается в том, что, когда пользователь выбирает элемент из всплывающего окна и содержание Изменения текстового поля combobox содержат два события, выполняемых в documentListener, один - removeUpdate(), соответствующий удалению предыдущего содержимого, а другой - insertUpdate(), соответствующий вставке нового значения. Я хочу, чтобы выполнялось только одно исполнение моего кода, а не два. Как я могу избежать того, что код выполняется два раза, когда пользователь выбирает запись из всплывающего окна?

Я пробовал различную комбинацию из разных слушателей, но на данный момент безрезультатно.

В конце концов, я хочу, чтобы мой код выполнялся только один раз, когда: - Пользователь меняет текст в текстовое поле combobox. - Пользователь выбирает элемент из всплывающего окна combobox

Заранее спасибо.

[EDIT 1] В соответствии с поручением я обновил добавление SSCCE

myCombobox = new javax.swing.JComboBox<String>(); 
myCombobox.setEditable(true); 
((JTextComponent)myCombobox.getEditor().getEditorComponent()).getDocument().addDocumentListener(
    new DocumentListener(){ 
    @Override 
    public void insertUpdate(DocumentEvent e) { 
     System.out.println("insert performed"); 
    } 

    @Override 
    public void removeUpdate(DocumentEvent e) { 
     System.out.println("remove performed"); 
    } 

    @Override 
    public void changedUpdate(DocumentEvent e) { 
     System.out.println("change performed"); 
    } 
}); 

myCombobox.addItemListener(new ItemListener() { 
    @Override 
    public void itemStateChanged(ItemEvent event) { 
     if (event.getStateChange() == ItemEvent.SELECTED) { 
      System.out.println("Action performed"); 
     } 
    } 
}); 

Обратите внимание, что в этом случае у меня есть ItemEvent вместо ActionEvent, потому что я продолжаю изменять свой код поиска решения в любой в этом случае на поведение не должно влиять.

+0

'В соответствии с просьбой я обновил добавление SSCCE' - этот код не является SSCCE. Мы не можем скомпилировать или выполнить код. – camickr

ответ

1

Вы можете проверить ((JTextComponent)combobox.getEditor().getEditorComponent()).hasFocus(), чтобы убедиться, что пользовательский тип в редакторе.

+0

Да, но таким образом я не могу поймать события относительно изменения выбора, сделанного с помощью всплывающего окна. – user2572526

+0

Почему ты не можешь поймать? Также вы можете попытаться включить редактирование начала установки некоторого флага и вернуть его обратно после редактирования конца/отмены. – StanislavL

+0

К сожалению, редакторComponent продолжает фокусироваться также, когда я выбираю запись из всплывающего окна. Кроме того, я не могу использовать переменную, потому что DocumentEvent, похоже, срабатывает до того, как actionEvent при изменении выбора. – user2572526

Смежные вопросы