我在SWT中创建一个包含文本字段和列表的组件。每当输入文本时,它都会过滤列表。到目前为止,一切都很好,我只是想添加一些不错的可用性功能。
我想要做的是在List字段中侦听任何键事件,如果是按下Enter键我执行'ok'操作(已经完成)但是我希望焦点改为文本字段并且有在那里触发的关键事件。基本上,如果焦点在List字段上,并且用户键入了我希望它自动键入文本字段的内容。
响应keyPressed或keyReleased事件可以将焦点设置为文本字段,但我需要以某种方式重复keyEvent,以便实际输入所输入的内容。有什么想法吗?
答案 0 :(得分:2)
所以这就是我所做的:
itemList.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent e) {
if (e.keyCode == '\r' || e.keyCode == SWT.KEYPAD_CR) {
okButtonAction();
} else if (e.keyCode == SWT.ARROW_UP || e.keyCode == SWT.ARROW_DOWN || e.keyCode == SWT.ARROW_LEFT || e.keyCode == SWT.ARROW_RIGHT) {
super.keyReleased(e);
} else if (e.character > 0) {
filterInput.setFocus();
Event event = new Event();
event.type = SWT.KeyDown;
event.keyCode = e.keyCode;
event.character = e.character;
Display.getCurrent().post(event);
try {
Thread.sleep(10);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
event.type = SWT.KeyUp;
Display.getCurrent().post(event);
}
}
});
我读到Display.post方法用于进行自动GUI测试,但它适用于我的目的,所以除非有人能给我一个很好的理由,否则我会使用它吗?
答案 1 :(得分:0)
我的第一个想法是,可能有一种方法可以将重要事件(或将其副本)重新触发到文本字段。但这可能无法产生预期的结果,因为有些关键事件可能不希望从列表转移到文本,例如按向上和向下箭头键在列表中导航。
因此,您应该决定哪些关键事件会触发焦点转移。根据您的问题,我了解您正在实施文本过滤器,因此您应该将传输限制为文本字符。一旦知道输入的字符,就可以手动将其附加到过滤器文本(或插入文本字段的光标位置)。