Определение фокуса в SWT

Я знаю, что могу видеть, имеет ли конкретный виджет контроль в SWT с помощью isFocusControl() на нем. Однако, когда мой ожидаемый виджет не имеет фокуса, как я могу определить, что делает (другими словами, что отняло фокус)?

Я могу обрабатывать события клавиатуры с помощью прослушивателей траверса, но изменение фокуса с помощью щелчков мыши, похоже, мистифицирует мое приложение. Кажется, я не могу понять, как найти предмет, который взял фокус с предыдущего пункт.

у меня также возникают проблемы с надежной установкой фокуса на другой виджет из FocusLost прослушиватель, если фокус изменяется событием мыши.

какие предложения?

4 ответов


Это:

Display.getFocusControl();

Как пояснил, дисплей.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 после первого) Затем, как только у меня есть реальный класс, я затем бросаю в этот класс и вызываю правильные методы геттера, которые я помещаю в свой класс.

надеюсь, это поможет,