// TODO: improve filtering sclass AutoComboBox extends JComboBox { String keyWord[]; new Vector myVector; bool acceptOnTab; // don't work so good *() { setModel(new DefaultComboBoxModel(myVector)); setSelectedIndex(-1); setEditable(true); JTextField text = (JTextField) this.getEditor().getEditorComponent(); text.setFocusable(true); text.setText(""); text.addKeyListener(new ComboListener(this, myVector)); if (acceptOnTab) text.setFocusTraversalKeysEnabled(false); 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); } class ComboListener extends KeyAdapter { JComboBox cb; Vector vector; *(JComboBox *cb, Vector *vector) {} public void /*keyReleased*/keyPressed(KeyEvent key) { if (key.getKeyCode() == KeyEvent.VK_ENTER) ret; if (key.getKeyCode() == KeyEvent.VK_ESCAPE) { cb.hidePopup(); ret; } if (acceptOnTab && key.getKeyCode() == KeyEvent.VK_TAB /*&& key.getModifiers() == 0*/) { _print("Have tab event (modifiers=" + key.getModifiers() + ")"); if ((key.getModifiers() & ActionEvent.SHIFT_MASK) == 0 && cb.isPopupVisible()) { cb.setSelectedIndex(0); // accept item cb.hidePopup(); } else // standard tab behavior swing_standardTabBehavior(key); 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 emptyAfterTrim(text) ? vector : new Vector(scoredSearch(text, vector)); } } }