2010-08-13 71 views
3

我的應用程序我需要空間鍵來調用獨立於焦點小部件的函數,無論在應用程序中的任何地方,但只有當相應的選項卡是打開的。我發現一個可以添加一個過濾器來顯示,這樣的:SWT全球KeyListener按鈕焦點問題

getShell().getDisplay().addFilter(SWT.KeyDown, new Listener() { 

      public void handleEvent(Event arg0) { 
       if(arg0.character == 32) { /**SPACE*/ 
        if(mainTabs.getSelection().equals(analyseSoundFilesTab)) { 
         soundController.playButtonClickHandler(); 
        } 
       } 
      } 

     }); 

這工作正常的大部分時間,但如果我給一個按鈕,通過「標籤」或「Shift標籤」,重點公司有點奇怪 - 空格鍵會激活一個「按鈕按下」,就像用鼠標單擊按鈕一樣。我現在有點卡住,我不知道如何避免這... 對於按鈕,我已經實現了一個SelectionListener。

問候。

回答

2

您可以使用TraverseListener並禁用使用doin字段的新聞事件檢測。下面是一個示例代碼:

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以防止助記符遍歷。

2

選擇'Space key'是真正的問題,因爲它是大多數(所有?)操作系統中的一個通用功能,即按下空格等於選擇具有焦點的小部件。

出路將使用忽略空格的小部件Button小部件。

但是,它會混淆很多用戶,只是因爲他們期望一個聚焦的按鈕被選中時,他們擊中空間,並不期望一些其他行動。

+0

爲了清楚我想要什麼:也許你知道CoolEdit工具。他們在空格上有「播放文件」功能,我的廚師也希望這樣。你是對的,它會混淆標準的方式。 :/ – InsertNickHere 2010-08-13 11:05:24