Java SWT:将列表中的关键事件应用于文本字段

时间:2010-04-11 22:54:02

标签: java user-interface events swt listener

我在SWT中创建一个包含文本字段和列表的组件。每当输入文本时,它都会过滤列表。到目前为止,一切都很好,我只是想添加一些不错的可用性功能。

我想要做的是在List字段中侦听任何键事件,如果是按下Enter键我执行'ok'操作(已经完成)但是我希望焦点改为文本字段并且有在那里触发的关键事件。基本上,如果焦点在List字段上,并且用户键入了我希望它自动键入文本字段的内容。

响应keyPressed或keyReleased事件可以将焦点设置为文本字段,但我需要以某种方式重复keyEvent,以便实际输入所输入的内容。有什么想法吗?

2 个答案:

答案 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)

我的第一个想法是,可能有一种方法可以将重要事件(或将其副本)重新触发到文本字段。但这可能无法产生预期的结果,因为有些关键事件可能不希望从列表转移到文本,例如按向上和向下箭头键在列表中导航。

因此,您应该决定哪些关键事件会触发焦点转移。根据您的问题,我了解您正在实施文本过滤器,因此您应该将传输限制为文本字符。一旦知道输入的字符,就可以手动将其附加到过滤器文本(或插入文本字段的光标位置)。