Search code examples
javajcombobox

How to add a key listener to JComboBox with AutoCompleteSupport (glazedlists) in Java SE


How do I add a KeyListener to JComboBox with "AutoCompleteSupport" (glazedlists) in Java SE. I am working on a small program which has a JComboBox that works with AutoCompleteSupport. I want to execute a method if I press Enter key in the JComboBox. How can I do this with AutoCompleteSupport?


Solution

  • Check out AutoCompleteSupport (Glazed Lists) which mentions:

    JComboBox ActionEvents

    A single ActionEvent is fired from the JComboBox in these situations:

    1. the user hits the enter key
    2. the selected item within the popup is changed (which can happen due to a mouse click, a change in the autocompletion term, or using the arrow keys)
    3. the JComboBox loses focus and contains a value that does not appear in the ComboBoxModel

    Also check out these excerpts from the source:

    public void keyPressed(KeyEvent e) {
        if (!isTableCellEditor)
            doNotTogglePopup = false;
    
        // this KeyHandler performs ALL processing of the ENTER key otherwise multiple
        // ActionEvents are fired to ActionListeners by the default JComboBox processing.
        // To control processing of the enter key, we set a flag to avoid changing the
        // editor's Document in any way, and also unregister the ActionListeners temporarily.
        if (e.getKeyChar() == KeyEvent.VK_ENTER) {
            doNotChangeDocument = true;
            this.actionListeners = unregisterAllActionListeners(comboBox);
        }
    
        // make sure this backspace key does not modify our comboBoxEditorComponent's Document
        if (isTrigger(e))
            doNotChangeDocument = true;
    }
    

    And:

    public void keyReleased(KeyEvent e) {
        // resume the ability to modify our comboBoxEditorComponent's Document
        if (isTrigger(e))
            doNotChangeDocument = false;
    
        // keyPressed(e) has disabled the JComboBox's normal processing of the enter key
        // so now it is time to perform our own processing. We reattach all ActionListeners
        // and simulate exactly ONE ActionEvent in the JComboBox and then reenable Document changes.
        if (e.getKeyChar() == KeyEvent.VK_ENTER) {
            updateFilter();
    
            // reregister all ActionListeners and then notify them due to the ENTER key
    
            // Note: We *must* check for a null ActionListener[]. The reason
            // is that it is possible to receive a keyReleased() callback
            // *without* a corresponding keyPressed() callback! It occurs
            // when focus is transferred away from the ComboBoxEditor and
            // then the ENTER key transfers focus back to the ComboBoxEditor.
            if (actionListeners != null) {
                registerAllActionListeners(comboBox, actionListeners);
                comboBox.actionPerformed(new ActionEvent(e.getSource(), e.getID(), null));
            }
    
            // null out our own reference to the ActionListeners
            actionListeners = null;
    
            // reenable Document changes once more
            doNotChangeDocument = false;
        }
    
        if (!isTableCellEditor)
            doNotTogglePopup = true;
    }
    

    Looks like you want an ActionListener instead of a KeyListener.