Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaSWT:将关键事件从列表应用到文本字段_Java_User Interface_Events_Swt_Listener - Fatal编程技术网

JavaSWT:将关键事件从列表应用到文本字段

JavaSWT:将关键事件从列表应用到文本字段,java,user-interface,events,swt,listener,Java,User Interface,Events,Swt,Listener,我正在SWT中制作一个包含文本字段和列表的组件。无论何时输入文本,它都会过滤列表。到目前为止,一切都很好,我只是想添加一些很好的可用性特性 我要做的是监听列表字段中的任何按键事件,如果按下Enter键,我将执行“确定”操作(已完成),否则我希望焦点切换到文本字段并在那里触发按键事件。基本上,如果焦点在列表字段上,并且用户键入了一些内容,我希望它自动键入到文本字段中 响应keyPressed或keyReleased事件可以将焦点设置为文本字段,但我需要以某种方式重复keyEvent,以便实际输入键

我正在SWT中制作一个包含文本字段和列表的组件。无论何时输入文本,它都会过滤列表。到目前为止,一切都很好,我只是想添加一些很好的可用性特性

我要做的是监听列表字段中的任何按键事件,如果按下Enter键,我将执行“确定”操作(已完成),否则我希望焦点切换到文本字段并在那里触发按键事件。基本上,如果焦点在列表字段上,并且用户键入了一些内容,我希望它自动键入到文本字段中


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

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

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

我就是这么做的:

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测试的,但它在这里是为我的目的而工作的,所以我会使用它,除非有人能给我一个很好的理由,为什么不呢