JComboBox: adding automatic completion-Case insensitive matching
//Code from: http://www.orbital-computer.de/JComboBox/ /* Inside JComboBox: adding automatic completion Author: Thomas Bierhance thomas@orbital-computer.de */ /* Case insensitive matching The typical usecases for an autocompleting combo box will hardly need case sensitive matches. It is easy to modify the lookup mechanism to ignore case, so that the user does not have to care about typing 'E' or 'e'. This short method does the trick... */ import javax.swing.*; import javax.swing.text.*; public class S05CaseInsensitive extends PlainDocument { JComboBox comboBox; ComboBoxModel model; JTextComponent editor; // flag to indicate if setSelectedItem has been called // subsequent calls to remove/insertString should be ignored boolean selecting=false; public S05CaseInsensitive(final JComboBox comboBox) { this.comboBox = comboBox; model = comboBox.getModel(); editor = (JTextComponent) comboBox.getEditor().getEditorComponent(); } public void remove(int offs, int len) throws BadLocationException { // return immediately when selecting an item if (selecting) return; super.remove(offs, len); } public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { // return immediately when selecting an item if (selecting) return; // insert the string into the document super.insertString(offs, str, a); // lookup and select a matching item Object item = lookupItem(getText(0, getLength())); setSelectedItem(item); setText(item.toString()); // select the completed part highlightCompletedText(offs+str.length()); } private void setText(String text) throws BadLocationException { // remove all text and insert the completed string super.remove(0, getLength()); super.insertString(0, text, null); } private void highlightCompletedText(int start) { editor.setSelectionStart(start); editor.setSelectionEnd(getLength()); } private void setSelectedItem(Object item) { selecting = true; model.setSelectedItem(item); selecting = false; } private Object lookupItem(String pattern) { // iterate over all items for (int i=0, n=model.getSize(); i < n; i++) { Object currentItem = model.getElementAt(i); // current item starts with the pattern? if (startsWithIgnoreCase(currentItem.toString(), pattern)) { System.out.println("'" + currentItem + "' matches pattern '" + pattern + "'"); return currentItem; } } // no item starts with the pattern => return null return null; } // checks if str1 starts with str2 - ignores case private boolean startsWithIgnoreCase(String str1, String str2) { return str1.toUpperCase().startsWith(str2.toUpperCase()); } private static void createAndShowGUI() { // the combo box (add/modify items if you like to) JComboBox comboBox = new JComboBox(new Object[] {"Ester", "Jordi", "Jordina", "Jorge", "Sergi"}); // has to be editable comboBox.setEditable(true); // get the combo boxes editor component JTextComponent editor = (JTextComponent) comboBox.getEditor().getEditorComponent(); // change the editor's document editor.setDocument(new S05CaseInsensitive(comboBox)); // create and show a window containing the combo box JFrame frame = new JFrame(); frame.setDefaultCloseOperation(3); frame.getContentPane().add(comboBox); frame.pack(); frame.setVisible(true); } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } }