我编写了一个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
?当我按住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’。
检查下面的代码以获取更多详细信息。对于演示,我尝试将监听器置于Display
和Test
。
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 删除功能呢?