Как я могу узнать, когда текст редактируемого JComboBox был изменен? - PullRequest
18 голосов
/ 10 августа 2009

У меня есть редактируемый JComboBox, в котором я хочу предпринять некоторые действия при изменении текста, набрав или выделив. В этом случае текст является шаблоном, и я хочу убедиться, что шаблон действителен, и показать совпадения, которые приводят к некоторым тестовым данным.

Сделав очевидное, прикрепив ActionHandler, я обнаружил, что при наборе текста событие, по-видимому, срабатывает ненадежно, в лучшем случае (выбор в порядке). И когда он запускает в результате набора текста, извлеченный текст (используя getEditor (). GetItem (), поскольку getSelectedItem () получает текст, только когда он был выбран из списка), кажется, текст, как это было, когда было запущено последнее событие, то есть всегда отсутствует символ, который был набран непосредственно перед срабатыванием события действия.

Я ожидал, что событие действия сработает после некоторой короткой задержки (от 500 мс до 1 секунды), но, похоже, оно сразу срабатывает при нажатии (если оно вообще срабатывает).

Единственная работоспособная альтернатива, о которой я могу подумать, - это просто запустить 1-секундный таймер при достижении фокуса, убить его при потере фокуса и выполнить работу как действие таймера, если содержимое отличается от последнего времени.

Есть мысли или предложения?

Фрагменты кода не особенно интересны:

find.addActionListener(this);
...
public void actionPerformed(ActionEvent evt) {
    System.out.println("Find: "+find.getEditor().getItem());
    }

Ответы [ 3 ]

31 голосов
/ 10 августа 2009

Слушатель действий обычно срабатывает только тогда, когда вы нажимаете клавишу ввода или перемещаете фокус в сторону от редактора комбинированного списка. Правильный способ перехвата отдельных изменений в редакторе состоит в том, чтобы зарегистрировать прослушиватель документов:

final JTextComponent tc = (JTextComponent) combo.getEditor().getEditorComponent();
tc.getDocument().addDocumentListener(this);

В интерфейсе DocumentListener есть методы, которые вызываются при изменении документа, поддерживающего редактор (insertUpdate, removeUpdate, changeUpdate).

Вы также можете использовать анонимный класс для более детального контроля того, откуда происходят события:

final JTextComponent tcA = (JTextComponent) comboA.getEditor().getEditorComponent();
tcA.getDocument().addDocumentListener(new DocumentListener() { 
  ... code that uses comboA ...
});

final JTextComponent tcB = (JTextComponent) comboB.getEditor().getEditorComponent();
tcB.getDocument().addDocumentListener(new DocumentListener() { 
  ... code that uses comboB ...
});
0 голосов
/ 11 декабря 2016

звучит как лучшее решение

jComboBox.getEditor().getEditorComponent().addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent evt) {    //add your hadling code here:

}    });
0 голосов
/ 06 декабря 2012

Вы можете использовать что-то вроде этого:

JComboBox cbListText = new JComboBox();
cbListText.addItem("1");
cbListText.addItem("2");
cbListText.setEditable(true);
final JTextField tfListText = (JTextField) cbListText.getEditor().getEditorComponent();
tfListText.addCaretListener(new CaretListener() {
    private String lastText;

    @Override
    public void caretUpdate(CaretEvent e) {
        String text = tfListText.getText();
        if (!text.equals(lastText)) {
            lastText = text;
            // HERE YOU CAN WRITE YOUR CODE
        }
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...