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

mch*_*chr 10 java swt keyboard-shortcuts event-handling

我编写了一个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);
  }
});
Run Code Online (Sandbox Code Playgroud)

我期待当我按下Ctrl+时f会看到以下输出:

Filter-ctrl: 262144
Filter-mask: 262144
Filter-char: f
Run Code Online (Sandbox Code Playgroud)

但是,在实践中我实际上看到以下内容.

Filter-ctrl: 262144
Filter-mask: 262144
Filter-char: <unprintable char - displayed as a box in eclipse console>
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

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

Fav*_*ius 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.根据javadoc,e.character你不会得到正好的角色f:

根据事件,键入的键所代表的字符.这是应用所有修改器后生成的最终字符.例如,当用户键入Ctrl + A时,字符值为0x01(ASCII SOH).

所以当你按CTRL+ f然后它转换为0x06(ASCII ACK).当你做ALT+ f SHIFT + 时不是这种情况f.

另一方面,javadoc e.keyCode说:

取决于事件,键入的键的键代码,由类SWT中的键代码常量定义.当事件的字符字段不明确时,此字段包含原始字符的未受影响的值.例如,键入Ctrl + M或Enter两者都会产生字符'\ _ \',但keyCode字段在输入Enter时也会包含'\ 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 ();

    }
}
Run Code Online (Sandbox Code Playgroud)