SWT Global KeyListener按钮焦点问题

时间:2010-08-13 10:42:56

标签: java swt

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

 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。

的问候。

2 个答案:

答案 0 :(得分:2)

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

一种方法是使用忽略Space的子类Button小部件。

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

答案 1 :(得分:2)

您可以使用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以防止助记符遍历。