如何在我的SWT应用程序中检测ctrl-f

时间:2011-04-30 13:53:52

标签: java event-handling keyboard-shortcuts swt

我编写了一个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>

我有两个问题:

  • Display.addFilter(...)是添加全局快捷方式的最佳方式吗?我尝试了Display.addListener(...),但这根本没有收到任何事件。
  • 当我按住 Ctrl 时,为什么我没有得到按下的字符?当我按住alt或shift时,我会得到预期的面具和按下的角色。

1 个答案:

答案 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.keyCodeDisplay上。

Test