import java.awt.BorderLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.ComboBoxEditor;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.plaf.basic.BasicComboBoxEditor;
public class Main {
public static void main(String[] args) {
JFrame fr = new JFrame();
JPanel p = new JPanel();
p.setLayout(new BorderLayout());
String[] ss = new String[] { "112", "1223", "1124", "1134" };
fr.getContentPane().add(p);
AutoCompleteComboBox cb = new AutoCompleteComboBox(ss);
p.add("South", cb);
p.add("Center", new JButton("test combo box"));
fr.pack();
fr.setVisible(true);
}
}
class AutoCompleteComboBox extends JComboBox {
public int caretPos = 0;
public JTextField tf = null;
public AutoCompleteComboBox(final Object items[]) {
super(items);
this.setEditor(new BasicComboBoxEditor());
this.setEditable(true);
}
public void setSelectedIndex(int ind) {
super.setSelectedIndex(ind);
tf.setText(getItemAt(ind).toString());
tf.setSelectionEnd(caretPos + tf.getText().length());
tf.moveCaretPosition(caretPos);
}
public void setEditor(ComboBoxEditor anEditor) {
super.setEditor(anEditor);
if (anEditor.getEditorComponent() instanceof JTextField) {
tf = (JTextField) anEditor.getEditorComponent();
tf.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent ev) {
char key = ev.getKeyChar();
if (!(Character.isLetterOrDigit(key) || Character.isSpaceChar(key))){
return;
}
String s = tf.getText();
caretPos = tf.getCaretPosition();
try {
String text = tf.getText(0, caretPos);
int n = getItemCount();
for (int i = 0; i < n; i++) {
int ind = ((String) getItemAt(i)).indexOf(text);
if (ind == 0) {
setSelectedIndex(i);
return;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
}
}
}