SWT Global KeyListener按钮焦点问题

对于我的应用程序,我需要空格键来调用独立于焦点小部件的函数,在应用程序的任何位置,但仅当相应的选项卡打开时。 我发现可以在显示器上添加一个filter,如下所示:

getShell().getDisplay().addFilter(SWT.KeyDown, new Listener() { public void handleEvent(Event arg0) { if( arg0.character == 32 ) { /**SPACE*/ if( mainTabs.getSelection().equals(analyseSoundFilesTab)) { soundController.playButtonClickHandler(); } } } }); 

这大部分时间都可以正常工作,但如果我通过“标签”或“移位标签”给出一个按钮,它有点奇怪 – 空格键将激活“按下按钮”,就好像单击按钮一样老鼠。 我现在有点卡住了,我不知道如何避免这个……对于按钮,我已经实现了一个SelectionListener。

问候。

您可以使用doin字段使用TraverseListener和禁用的按事件检测。 这是一个示例代码:

 display.addFilter(SWT.KeyDown, new Listener() { public void handleEvent(Event e) { if (e.character == 32) { System.out.printf("Space detected %s\n", e); } } }); Button b1 = new Button(shell, SWT.PUSH); b1.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent se) { System.out.printf("Button pressed %s\n", se); } }); b1.addTraverseListener(new TraverseListener() { @Override public void keyTraversed(TraverseEvent te) { System.out.printf("Traverse detected %s\n", te); te.doit = true; } }); 

如果addTraverseListener()不存在,则在过滤后检测到空格按钮,因此您会看到“检测到空格…”,然后看到“按下按钮…”。 既然你设置了te.doit = true ,你就要对SWT进行空格键遍历(实际上什么都不做)而不是触发键监听器。 您可以选择检查te.detail以仅防止助记符遍历。

选择“空格键”是一个真正的问题,因为它是大多数(全部?)操作系统的一般function,即按空格等于选择具有焦点的小部件。

一种方法是使用忽略Space的子类Button

但它会让很多用户感到困惑,因为他们希望在他们占据空间时选择一个聚焦按钮而不期望采取其他行动。