Java 如何在我的SWT应用程序中检测ctrl-f
我编写了一个SWT UI,它的主要功能是在StyledText控件中显示文本。我想为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
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
您不会只得到characterf
:
根据事件的不同,角色
由键入的键表示。
这是最后一个角色
所有修改器都已修改后的结果
应用例如,当用户
键入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-建议您将其作为单独的问题提问。相关: