效果如下:
直接上代码:
public class AutoCompleteComboMain {
static final Display display = new Display();
static final Shell shell = new Shell(display);
static String[] items = new String[] { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
public static void main(String[] args) {
shell.setText("SWT");
shell.setLayout(new GridLayout());
Combo combo = new Combo(shell, SWT.BORDER);
for (int i = 0; i < items.length; i++) {
combo.add(items[i]);
}
ComboUtil.addAutoCompleteFeature(combo);
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
关键的ComboUtil的代码如下:
public class ComboUtil {
public static void addAutoCompleteFeature(Combo combo) {
// Add a key listener
combo.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent keyEvent) {
Combo cmb = ((Combo) keyEvent.getSource());
setClosestMatch(cmb);
}
// Move the highlight back by one character for backspace
public void keyPressed(KeyEvent keyEvent) {
if (keyEvent.keyCode == SWT.BS) {
Combo cmb = ((Combo) keyEvent.getSource());
Point pt = cmb.getSelection();
cmb.setSelection(new Point(Math.max(0, pt.x - 1), pt.y));
}
}
private void setClosestMatch(Combo combo) {
String str = combo.getText();
String[] cItems = combo.getItems();
// Find Item in Combo Items. If full match returns index
int index = -1;
for (int i = 0; i < cItems.length; i++) {
if (cItems[i].toLowerCase().startsWith(str.toLowerCase())) {
index = i;
break;
}
}
if (index != -1) {
Point pt = combo.getSelection();
combo.select(index);
combo.setText(cItems[index]);
combo.setSelection(new Point(pt.x, cItems[index].length()));
}
}
});
}
参考:http://www.eclipsezone.com/eclipse/forums/t95109.html
http://sourcezone.wordpress.com/2008/02/14/java-jface-autocomplete-comboviewer/