//Code from: http://www.orbital-computer.de/JComboBox/
/*
Inside JComboBox: adding automatic completion
Author: Thomas Bierhance
thomas@orbital-computer.de
*/
/*
Adding automatic completion
Now, to do automatic completion instead of just automatic selection access to the combo box'
editor is needed. Otherwise it would not be possible to highlight the completed part using
selection (see above). I added the whole JComboBox to the constructor. The selection should
start right after the last character that was inserted (at position offs+str.length()).
*/
import javax.swing.*;
import javax.swing.text.*;
public class S04FirstAutoCompletion extends PlainDocument {
JComboBox comboBox;
ComboBoxModel model;
// flag to indicate if setSelectedItem has been called
// subsequent calls to remove/insertString should be ignored
boolean selecting=false;
public S04FirstAutoCompletion(final JComboBox comboBox) {
this.comboBox = comboBox;
model = comboBox.getModel();
}
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);
// remove all text and insert the completed string
super.remove(0, getLength());
super.insertString(0, item.toString(), a);
// select the completed part
JTextComponent editor = (JTextComponent) comboBox.getEditor().getEditorComponent();
editor.setSelectionStart(offs+str.length());
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 (currentItem.toString().startsWith(pattern)) {
return currentItem;
}
}
// no item starts with the pattern => return null
return null;
}
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 S04FirstAutoCompletion(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();
}
});
}
}
|