Подтвердить что ты не робот

Как узнать, когда был изменен текст редактируемого JComboBox?

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

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

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

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

Любые мысли или предложения?

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

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

Ответ 1

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

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

Ответ 2

Вы можете использовать somthing как это:

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

Ответ 3

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

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

}    });