我编写了一个SWT UI,它具有在StyledText控件中显示文本的主要功能。我想为 Ctrl + F 添加处理程序,以便在按下该快捷键时将焦点设置为搜索框。我尝试使用以下代码来检测按键。
sWindow = new Shell();
...
sWindow.getDisplay().addFilter(SWT.KeyDown, new Listener()
{
@Override
public void handleEvent(Event e)
{
System.out.println("Filter-ctrl: " + SWT.CTRL);
System.out.println("Filter-mask: " + e.stateMask);
System.out.println("Filter-char: " + e.character);
}
});
我期待当我按 Ctrl + f 时,我会看到以下输出:
Filter-ctrl: 262144
Filter-mask: 262144
Filter-char: f
然而,实际上我实际上看到以下内容。
Filter-ctrl: 262144
Filter-mask: 262144
Filter-char: <unprintable char - displayed as a box in eclipse console>
我有两个问题:
答案 0 :(得分:31)
的 Is Display.addFilter(...) the best way to add a glbal shortcut? I tried Display.addListener(...) but this didn't receive any events at all.
强> 的
是的,通常Display.addFilter(...)
是添加glbal快捷方式的最佳方式,因为它们对事件侦听器有更高的偏好。请参阅Display.addFilter(...)
javadoc的以下评论。
因为事件过滤器在其他之前运行 听众,事件过滤器都可以 阻止其他侦听器和设置 事件中的任意字段。对于 这个原因,事件过滤器都是 强大而危险。他们应该 一般应避免表现, 调试和代码维护 的原因。
<小时/> 对于您的第二个问题:
的 Why don't I get the pressed character when I'm holding down ctrl? When I hold down alt or shift I get the expected mask and the pressed character.
强> 的
问题在于你正在寻找错误的地方。您应该使用e.character
而不是查询e.keyCode
。根据{{1}}的javadoc,您不会只获得字符e.character
:
取决于事件,角色 由键入的键表示。 这是最后一个角色 所有修饰符之后的结果 应用。例如,当用户 类型Ctrl + A,字符值为 0x01(ASCII SOH)。
因此,当您按 CTRL + f 时,它将转换为f
(ASCII ACK)。当你做 ALT + f 或 SHIFT + f 时不是这种情况。
另一方面,0x06
的javadoc说:
取决于事件,密钥代码 键入的键,如定义的那样 通过类中的键代码常量 SWT。当字符字段 事件很模糊,这个领域 包含未受影响的值 原始人物。例如, 输入Ctrl + M或输入两个结果 字符'\ r'但是keyCode 字段还将包含'\ r'时 按Ctrl + M键入Enter,输入“m” 打字了。
检查以下代码以获取更多详细信息。对于演示,我尝试将监听器放在e.keyCode
和Display
上。
Test