当前位置: 首页 > 面试题库 >

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

澹台镜
2023-03-14
问题内容

我编写了一个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时,会得到预期的遮罩和按下的字符。

问题答案:

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(...)是添加全局快捷方式的最佳方法,因为它们比事件侦听器具有更高的优先级。请参见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+ f SHIFT +
时,情况并非如此f

另一方面,javadoc e.keyCode表示:

根据事件,所键入的密钥的密钥代码,由类SWT中的密钥代码常量定义。当事件的字符字段不明确时,该字段将包含原始字符的不受影响的值。例如,键入Ctrl +
M或Enter都输入字符’\ r’,但键入Enter时keyCode字段也将包含’\ r’,而键入Ctrl + M时keyCode字段还将包含’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 ();

    }
}


 类似资料:
  • 问题内容: 如何使用Javascript 检测+ ,+ ? 我需要限制粘贴到我的文本区域中,最终用户不应复制和粘贴内容,用户只能在文本区域中键入文本。 如何实现呢? 问题答案: 我只是出于兴趣而这样做。我同意这是不正确的事情,但我认为它应该是OP的决定......另外,代码可以很容易地扩展到增加功能,而不是把它拿走(如更先进的剪贴板,或+ 触发服务器-端保存)。 还要澄清一下,该脚本需要jQuer

  • 我在一个字处理器上工作,我需要知道我的程序是在什么用户中,这样我的程序就可以在启动时自动检测它,并将文件保存在他们的我的文档中。Im使用Java。而且我没有目录检测的预编码。但如果这有帮助,这里是我的代码:

  • 问题内容: 如何在CLI(命令行界面)Java应用程序中截获 (通常会杀死进程)? 是否存在多平台解决方案(Linux,Solaris,Windows)? 我使用的是,但是如有必要,我可以使用其他方法从标准输入中读取字符。 问题答案: 这应该能够截获信号,但是仅作为JVM完全关闭自身之前的中间步骤,因此它可能不是你要注意的。 你需要使用截获 触发的信号C(在Unix和Windows上)。

  • 问题内容: 如何检测expressJS应用程序在什么环境中运行?(开发,测试,生产?)。没有任何迹象表明环境… 我知道您可以在每种环境下的配置文件中声明变量,但这对动态加载模块没有帮助… 问题答案: 您可以通过选中(可以在Express中使用)检查环境,也可以通过直接检查(在该变量中找到的环境或默认为“开发”中的环境)来更直接地进行操作。其他库,例如Socket.IO等)。

  • 样本输出字符串:检测到汉娜输出元音的最后一部分:检测到辅音:h n n h

  • 我已经创建了一个SWT文本编辑器,并且实现了剪切、复制和粘贴功能,但是现在我需要实现< kbd > CTRL < kbd > back space ,来删除前面的单词,还需要实现< kbd>CTRL DEL,来删除前面的单词。 复制文本的代码 编辑器的代码 听众 那么现在如何在SWT中实现< kbd>CTRL 退格键和< kbd>CTRL 删除功能呢?