Определение фокуса в SWT
Я знаю, что могу видеть, имеет ли конкретный виджет контроль в SWT с помощью isFocusControl()
на нем. Однако, когда мой ожидаемый виджет не имеет фокуса, как я могу определить, что делает (другими словами, что отняло фокус)?
Я могу обрабатывать события клавиатуры с помощью прослушивателей траверса, но изменение фокуса с помощью щелчков мыши, похоже, мистифицирует мое приложение. Кажется, я не могу понять, как найти предмет, который взял фокус с предыдущего пункт.
у меня также возникают проблемы с надежной установкой фокуса на другой виджет из FocusLost
прослушиватель, если фокус изменяется событием мыши.
какие предложения?
4 ответов
Как пояснил, дисплей.getFocusControl () сообщает вам, какой элемент управления имеет фокус. Вы можете связать информацию с виджетами с помощью методов setData (). Вы можете сделать это с каждым элементом управления, который может получить фокус, а затем getData() должен помочь вам понять, какой элемент управления имеет фокус.
в противном случае вы можете просто сохранить указатели на элементы управления, которые вы создали, и сравнить указатель с известными указателями управления, нет?
Так как это сложный вопрос, Позвольте мне добавить кое-что относительно второй части вопроса:
У меня также возникают проблемы с надежной установкой фокуса на другой виджет из прослушивателя FocusLost, если фокус изменяется событием мыши.
при изменении фокуса с помощью мыши событие мыши обрабатывается после событий фокуса. Это может привести к тому, что событие mouse отменит изменения, применяемые в фокусе события.
например, чтобы выбрать содержимое текстового поля после того, как текстовое поле получает фокус щелчком мыши, асинхронный вызов позволяет отложить выделение до отправки событий.
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();
}
}
});
}
});
без асинхронного вызова событие mouse отменяет выбор, сделанный в событии focus.
getFocusControl возвращает элемент управления и ваш элемент наследует от Control. Я использую кучу пользовательских элементов управления, и когда я получаю фокус, я затем определяю, какой класс это действительно, используя набор операторов if (control instanceof myclass) (иначе ifs после первого) Затем, как только у меня есть реальный класс, я затем бросаю в этот класс и вызываю правильные методы геттера, которые я помещаю в свой класс.
надеюсь, это поможет,