static bool AutoComboBox_handleTab = true; // experimental sclass AutoComboBox extends JComboBox { String keyWord[] = {"item1", "item2", "item3"}; Vector myVector = new Vector(); *() { setModel(new DefaultComboBoxModel(myVector)); setSelectedIndex(-1); setEditable(true); if (AutoComboBox_handleTab) setFocusTraversalKeysEnabled(false); JTextField text = (JTextField) this.getEditor().getEditorComponent(); text.setFocusable(true); text.setText(""); text.addKeyListener(new ComboListener(this, myVector)); setMyVector(); } /** * set the item list of the AutoComboBox * @param keyWord an String array */ void setKeyWord(String[] keyWord) { this.keyWord = keyWord; setMyVector(); } void setKeyWord(Collection keyWord) { setKeyWord(toStringArray(keyWord)); } private void setMyVector() { copyArrayToVector(keyWord, myVector); } } sclass ComboListener extends KeyAdapter { JComboBox cb; Vector vector; *(JComboBox *cb, Vector *vector) {} public void keyReleased(KeyEvent key) { if (key.getKeyCode() == KeyEvent.VK_ENTER) ret; if (key.getKeyCode() == KeyEvent.VK_ESCAPE) { cb.hidePopup(); ret; } if (key.getKeyCode() == KeyEvent.VK_TAB && key.getModifiers() == 0) { if (cb.isPopupVisible()) cb.setSelectedIndex(0); /* XXX - accepts item? */ else // standard tab behavior KeyboardFocusManager.getCurrentKeyboardFocusManager().focusNextComponent(); ret; } JTextField tf = cast cb.getEditor().getEditorComponent(); if (tf.getCaretPosition() != l(tf.getText())) ret; String text = ((JTextField) key.getSource()).getText(); Vector list = getFilteredList(text); if (nempty(list)) { cb.setModel(new DefaultComboBoxModel(list)); cb.setSelectedIndex(-1); tf.setText(text); // necessary? cb.showPopup(); } else cb.hidePopup(); } public Vector getFilteredList(String text) { ret new Vector(scoredSearch(text, vector)); } }