Поскольку это сложно, позвольте мне добавить кое-что относительно второй части вопроса:
У меня также возникают проблемы с надежной настройкой фокуса на другой виджет из слушателя FocusLost, если фокус изменяется при событии мыши.
При изменении фокуса с помощью мыши событие мыши обрабатывается после событий фокуса. Это может привести к тому, что событие мыши отменит изменения, которые вы применяете в событиях фокуса.
Например, чтобы выбрать содержимое текстового поля после того, как текстовое поле получает фокус с помощью щелчка мыши, асинхронный вызов позволяет отложить выбор до отправки событий.
textfield.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
}
@Override
public void focusGained(FocusEvent e) {
Display.getCurrent().asyncExec(new Runnable() {
@Override
public void run() {
if (!textfield.isDisposed()) {
textfield.selectAll();
}
}
});
}
});
Без асинхронного вызова событие мыши отменяет выбор, сделанный в событии фокуса.