Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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
Java 如何在我的SWT应用程序中检测ctrl-f_Java_Event Handling_Keyboard Shortcuts_Swt - Fatal编程技术网

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

Java 如何在我的SWT应用程序中检测ctrl-f,java,event-handling,keyboard-shortcuts,swt,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.pri

我编写了一个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>
过滤器ctrl:262144
滤光片:262144
过滤字符:
我有两个问题:

  • Display.addFilter(…)是添加全局快捷方式的最佳方式吗?我尝试了Display.addListener(…),但根本没有收到任何事件
  • 为什么我在按住Ctrl键的时候不能得到按下的字符?当我按下alt或shift键时,我会得到预期的掩码和按下的字符
显示。添加过滤器(…)是添加glbal快捷方式的最佳方式吗?我尝试了Display.addListener(…),但根本没有收到任何事件。

是的,通常
Display.addFilter(…)
是添加glbal快捷方式的最佳方式,因为它们比事件侦听器具有更高的首选项。请参阅
Display.addFilter(…)
javadoc中的以下注释

因为事件筛选器在其他筛选器之前运行 侦听器、事件筛选器都可以 阻止其他侦听器并设置 事件中的任意字段。对于 因此,事件筛选器都是 强大而危险。他们应该 通常情况下,应避免使用, 调试和代码维护 原因


关于第二个问题:

当我按住ctrl键时,为什么不得到按下的字符?当我按下alt或shift键时,会得到预期的掩码和按下的字符。

问题是你看错地方了。您应该使用
e.keyCode
而不是查询
e.character
。根据javadoc的
e.character
您不会只得到character
f

根据事件的不同,角色 由键入的键表示。 这是最后一个角色 所有修改器都已修改后的结果 应用例如,当用户 键入Ctrl+A,字符值为 0x01(ASCII SOH)

因此,当按下CTRL+f时,它将转换为
0x06
(ASCII确认)。当您执行ALT+f或SHIFT+f时,情况并非如此

另一方面,
e.keyCode
的javadoc说:

根据事件的不同,键代码 按定义键入的键的 通过类中的键代码常量 SWT。当 事件不明确,此字段无效 包含未受影响的 原创人物。例如 键入Ctrl+M或同时输入这两个结果 字符'\r',但键码 字段也将包含“\r”当 键入了Enter,当Ctrl+m时为“m” 是打字的

有关更多详细信息,请查看下面的代码。对于演示,我已尝试将侦听器置于
显示
测试

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 ();

    }
}

这是一个极好的答案——我现在已经找到了捷径。谢谢下次我会努力把这些文件读得更好!这也解决了我的问题,谢谢你的明确解释+1我们如何通过添加这样的筛选器来覆盖系统快捷键(如ctrl+c)?@Fahad-建议您将其作为单独的问题提问。相关: