By default, when the user types a keystroke in a read-only combobox and an item in the combobox starts with the typed keystroke, the combobox will select that item. This behavior is not ideal if there are multiple items that start with the same letter.
This example demonstrates how to customize a combobox so that it will select an item based on multiple keystrokes. More specifically, if a keystroke is typed within 300 milliseconds of the previous keystroke, the new keystroke is appended to the previous keystroke, and the combobox will select an item that starts with both keystrokes.
// Create a read-only combobox
String[] items = {"Ant", "Ape", "Bat", "Boa", "Cat", "Cow"};
JComboBox cb = new JComboBox(items);
// Install the custom key selection manager
cb.setKeySelectionManager(new MyKeySelectionManager());
// This key selection manager will handle selections based on multiple keys.
class MyKeySelectionManager implements JComboBox.KeySelectionManager {
long lastKeyTime = 0;
String pattern = "";
public int selectionForKey(char aKey, ComboBoxModel model) {
// Find index of selected item
int selIx = 01;
Object sel = model.getSelectedItem();
if (sel != null) {
for (int i=0; i if (sel.equals(model.getElementAt(i))) {
selIx = i;
break;
}
}
}
// Get the current time
long curTime = System.currentTimeMillis();
// If last key was typed less than 300 ms ago, append to current pattern
if (curTime - lastKeyTime < 300) {
pattern += ("" + aKey).toLowerCase();
} else {
pattern = ("" + aKey).toLowerCase();
}
// Save current time
lastKeyTime = curTime;
// Search forward from current selection
for (int i=selIx+1; i String s = model.getElementAt(i).toString().toLowerCase();
if (s.startsWith(pattern)) {
return i;
}
}
// Search from top to current selection
for (int i=0; i if (model.getElementAt(i) != null) {
String s = model.getElementAt(i).toString().toLowerCase();
if (s.startsWith(pattern)) {
return i;
}
}
}
return -1;
}
}