最近使用swt开发一套试题编辑管理工具的时候遇到一个需求,就是用户需要从200多个选项中选出一个,如果使用下拉列表,显然很难使用,以前遇到这种问题的时候,一般都是使用“自动完成”来实现,就是让用户输入编号或者选项的拼音简拼,然后自动带出一个经过筛选的下拉列表,用户这个时候在这个经过筛选的下拉列表选择就可以了,以前曾经用vb和javascript各实现过一次,现在用swt来实现,思路比较简单,就是当用户在文本框输入编号或者拼音,然后按回车键以后,文本框的下面新建一个下拉列表,然后填充下拉列表,当用户选择下拉列表的时候,根据用户的选择填充文本框,同时销毁下拉列表,主要代码如下:
假设我们需要用户在考查点文本框输入拼音或者代码的时候,下面出现自动完成的下拉列表,
kcdText.addKeyListener(new KeyAdapter() {
public void keyPressed(final KeyEvent event) {
if (event.keyCode == SWT.CR || event.keyCode == SWT.LF) {
showlist(kcdText.getText());
}
}
});
private void showlist(String input) {
final org.eclipse.swt.widgets.List single = new org.eclipse.swt.widgets.List(
mainComposite, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL);
single.removeAll();
single.setVisible(false);
//tbkcdList是所有可供选择的考查点列表
for (Iterator iter = tbkcdList.values().iterator(); iter
.hasNext();) {
TbKcdDm obj = (TbKcdDm) iter.next();
//考查点对象的拼音属性可以用程序自动计算产生,网上有不少现成的例子
if (obj.getPinyin().indexOf(input) == 0
|| obj.getKcdid().toString().equals(input)) {
single.add("(" + obj.getKcdid() + ")" + obj.getKcdname());
}
}
single.setBounds(kcdText.getBounds().x, kcdText.getBounds().y
+ kcdText.getBounds().height, 200, 60);
single.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
String temptext = kcdText.getText();
if (temptext.indexOf("|") >= 0) {
kcdText.setText("|" + (single.getSelection()[0])
+ (temptext.substring(kcdText.getCaretPosition())));
} else {
kcdText.setText("|" + (single.getSelection()[0]));
}
single.setVisible(false);
single.dispose();
kcdText.setFocus();
}
});
if (single.getItemCount() > 0) {
single.setVisible(true);
}
else
{
single.dispose();
}
}
效果如图所示: