2011-04-30 47 views
10

我已经编写了一个SWT UI,它具有在StyledText控件中显示文本的主要功能。我想为添加处理程序Ctrl + F以便当按下该快捷键时,焦点被设置为搜索框。我曾尝试使用以下代码来检测按键。如何在我的SWT应用程序中检测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时,我会得到预期的面具和被按下的角色。

回答

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。由于每e.character的javadoc,你不会得到只是性格f

根据不同的情况下,由被输入的按键表示的字符 。 这是 在应用了所有修改器后的最终字符 。例如,当用户 键入Ctrl + A时,字符值为 0x01(ASCII SOH)。

所以,当你按下CTRL +˚F然后将其转换在0x06(ASCII ACK)。当你做ALT +˚FSHIFT +˚F这是不是这样的。

在另一方面e.keyCode的Javadoc说:

根据事件的关键代码被输入的关键 ,作为键代码常量类 SWT定义 。当 事件的字符字段不明确时,此字段 包含原始字符的未受影响的值。例如, 键入Ctrl + M或Enter两者都会导致 字符'\ r',但keyCode 字段也会包含'\ r',如果输入的是 ,键入Ctrl + M 时则为'm'。

请查看以下代码以获取更多详细信息。对于演示,我试图把听众放在DisplayTest上。

import org.eclipse.swt.SWT; 
import org.eclipse.swt.events.KeyEvent; 
import org.eclipse.swt.events.KeyListener; 
import org.eclipse.swt.graphics.Color; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Event; 
import org.eclipse.swt.widgets.Listener; 
import org.eclipse.swt.widgets.Shell; 

public class ControlF 
{ 
    public static void main(String[] args) 
    { 

     Display display = new Display(); 

     final Shell shell = new Shell (display); 
     final Color green = display.getSystemColor (SWT.COLOR_GREEN); 
     final Color orig = shell.getBackground(); 

     display.addFilter(SWT.KeyDown, new Listener() { 

      public void handleEvent(Event e) { 
       if(((e.stateMask & SWT.CTRL) == SWT.CTRL) && (e.keyCode == 'f')) 
       { 
        System.out.println("From Display I am the Key down !!" + e.keyCode); 
       } 
      } 
     }); 

     shell.addKeyListener(new KeyListener() { 
      public void keyReleased(KeyEvent e) { 
       if(((e.stateMask & SWT.CTRL) == SWT.CTRL) && (e.keyCode == 'f')) 
       { 
        shell.setBackground(orig); 
        System.out.println("Key up !!"); 
       } 
      } 
      public void keyPressed(KeyEvent e) { 
       if(((e.stateMask & SWT.CTRL) == SWT.CTRL) && (e.keyCode == 'f')) 
       { 
        shell.setBackground(green); 
        System.out.println("Key down !!"); 
       } 
      } 
     }); 

     shell.setSize (200, 200); 
     shell.open(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) display.sleep(); 
     } 
     display.dispose(); 

    } 
} 
+0

这是一个很好的答案 - 我现在有了我的捷径。谢谢!我会尽量在下次更好地阅读文档! – mchr 2011-05-01 08:08:46

+0

这也解决了我的问题,谢谢你的明确解释! +1 – 2011-09-07 11:47:22

+0

如何通过添加像这样的过滤器来覆盖像ctrl + c这样的系统快捷方式? – Fahad 2015-05-20 05:16:14

相关问题