如何在Java SE中使用AutoCompleteSupport(glazedlists)向JComboBox添加一个键监听器

时间:2011-11-18 13:51:01

标签: java jcombobox

如何在Java SE中使用“AutoCompleteSupport”(glazedlists)向KeyListener添加JComboBox。 我正在开发一个小程序,其中JComboBox与AutoCompleteSupport一起使用。如果我在JComboBox中按Enter键,我想执行一个方法。如何使用AutoCompleteSupport执行此操作?

1 个答案:

答案 0 :(得分:2)

查看提及的AutoCompleteSupport (Glazed Lists)

  

JComboBox ActionEvents

     

在这些情况下,JComboBox会触发一个ActionEvent:

     
      
  1. 用户点击回车键
  2.   
  3. 弹出窗口中的所选项目已更改(可能由于鼠标单击,自动完成术语更改或使用箭头键而发生)
  4.   
  5. JComboBox失去焦点并包含一个未出现在ComboBoxModel中的值
  6.   

另请参阅以下摘录:

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

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

您希望ActionListener代替KeyListener