2013-06-24 18 views
3

我有一堆控件,視圖和編輯器。我發現編輯有時會失去焦點。 這個問題很難在調試中重現,因爲當我在調試器中切換到斷點並回到應用程序時,編輯器從不失去焦點。如何找到控件失去焦點的原因

你能推薦一些小技巧嗎&技巧如何找到控制失去焦點的原因?

回答

5

添加一些上下文@大衛的回答是:

您可以將FocusListener添加到您的所有Widget秒。在此偵聽器中,您可以輸出關於丟失/獲得焦點的小部件的一些信息。

爲了使事情更容易,您可以使用Widget#setData(Object)將元數據添加到Widget


這裏是一個代碼示例,應該幫助你理出頭緒:

public static void main(String[] args) 
{ 
    Display display = new Display(); 
    final Shell shell = new Shell(display); 
    shell.setText("StackOverflow"); 
    shell.setLayout(new FillLayout()); 

    FocusListener focusListener = new FocusListener() 
    { 
     @Override 
     public void focusLost(FocusEvent e) 
     { 
      System.out.println("Focus out: " + e.widget.getData()); 
     } 

     @Override 
     public void focusGained(FocusEvent e) 
     { 
      System.out.println("Focus in: " + e.widget.getData()); 
     } 
    }; 

    Text text = new Text(shell, SWT.BORDER); 
    text.setText("Text"); 
    text.setData("Text"); 
    text.addFocusListener(focusListener); 

    Button button = new Button(shell, SWT.PUSH); 
    button.setText("Button"); 
    button.setData("Button"); 
    button.addFocusListener(focusListener); 

    shell.pack(); 
    shell.open(); 
    while (!shell.isDisposed()) 
    { 
     if (!display.readAndDispatch()) 
      display.sleep(); 
    } 
    display.dispose(); 
} 

通知setData()getData()利用率...

+0

有控件數量龐大,其誕生和死亡在多個線程中。如果沒有顯式調用addFocusListener,是否可以對任何控件執行此類跟蹤? –

+0

@PavelNuzhdin不,我不這麼認爲,對不起... – Baz

+0

有人建議我使用AOP(即aspectj)將偵聽器添加到所有控件或在Eclipse工作區中加載swt源代碼,並在其中加入setFocus。我成功地使用了最後的方法 –

3

添加發送日誌消息的焦點偵聽器?