代码之家  ›  专栏  ›  技术社区  ›  InsertNickHere

SWT全局KeyListener按钮焦点问题

  •  3
  • InsertNickHere  · 技术社区  · 14 年前

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

    这在大多数情况下都很好,但是如果我通过“tab”或“shift tab”给一个按钮焦点,那就有点奇怪了——空格键会激活一个“按下的按钮”,就像用鼠标点击按钮一样。我现在有点困了,我不知道如何避免这个。。。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Mohsen    14 年前

    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

        2
  •  2
  •   Andreas Dolk    14 年前

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

    一个解决方法是使用子类 Button

    但这会让很多用户感到困惑,仅仅因为他们希望在点击空格键时选择一个聚焦按钮,而不希望有其他动作。