Добавление некоторого контекста @ ответ Давида:
Вы можете добавить 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()
...
Есть огромное количество элементов управления, которые рождаются и умирают в нескольких потоках. Можно ли выполнять такую трассировку для любого элемента управления без явного вызова addFocusListener? –
@PavelNuzhdin Нет, я так не думаю, извините ... – Baz
Кто-то рекомендовал мне использовать AOP (например, aspectj), чтобы добавить слушателей ко всем элементам управления или загрузить источники swt в рабочую область eclipse и взломать setFocus. Я успешно использовал последний подход –