2013-06-24 7 views
3

У меня есть набор элементов управления, просмотров и редакторов. Я обнаружил, что редактор иногда теряет фокус. Эта проблема трудно воспроизвести при отладке, потому что, когда я переключаюсь на точку останова в отладчике и обратно в приложение, редактор никогда не теряет фокус.Как найти, почему управление теряет фокус

Можете ли вы рекомендовать советы & трюки, как найти, почему управление теряет фокус?

ответ

5

Добавление некоторого контекста @ ответ Давида:

Вы можете добавить FocusListener ко всем вашим Widget с. Внутри этого слушателя вы можете вывести некоторую информацию о виджетах, потерявших/получивших фокус.

Чтобы все было проще, вы можете добавить метаданные в Widget с помощью Widget#setData(Object).


Вот пример кода, который должен помочь вам понять вещи:

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), чтобы добавить слушателей ко всем элементам управления или загрузить источники swt в рабочую область eclipse и взломать setFocus. Я успешно использовал последний подход –

3

Добавить прослушиватель фокуса, который отправляет сообщение журнала?